2014-04-14 26 views
7

Aslında bir sınama çalışıyorum QML component which embeds C++ objects. Ne yazık ki, testleri gerçekleştirdiğimde bazı hatalar alıyorum. C++ nesneleri, QML dosyası tarafından tanınmıyor. Bu da C++ nesnelerinin main.cpp dosyasında ayarlandığından emin olur.Bir QML bileşeniyle eşleme nasıl yapılır

Sorum şu: QML sınamalarını gerçekleştirmek için bir içerik özelliğini nasıl kullanabilirim? Ya da, Qt/QML kodunu karıştırarak nasıl birim testi yapabilirim?

+0

Testlerinizi nasıl yürütüyorsunuz? QML'de birim testleri yazıyor ve testleri çalıştırmak için _qmltestrunner_'ı kullanmaya çalışıyor musunuz? Q ++ 'yu C++' da çalıştırmaya çalışıyor musunuz ve testleri _googlemock_ 'dan mı çalıştırıyorsunuz? Yoksa başka bir şey mi yapıyorsun? – dobey

+0

Hiç bu işe yaramadı mı? Aynı problemim var. –

+0

Çalıştığım bir şeyi buldum ve aşağıda bir cevap olarak ekledim. Ne yazık ki, yardım için orjinal ağlama oyalandı; Bu yüzden birisinin bir başka bakış açacağını ve düzenlenmiş olanı hayata döndüreceğini umuyorum. –

cevap

0

Seni doğru anladığım gibi, ben de aynı problemle karşılaştın. Bir süre önce bu alayı yazdım: https://bitbucket.org/troyane/qml-cpp-template (bu kodu sizin amaçlarınız için kullanamazsınız).

orada şeyler yapmanın iki yolu görebilirsiniz main.cpp bir göz atın:

// 1 case: 
// Register type and create object at QML side 
qmlRegisterType<CppClass>("CppClassModule", 1, 0, "CppClass"); 
QQmlApplicationEngine engine(QUrl("qrc:///qml/main.qml")); 
qDebug() << "Qt version: " << qVersion(); 
// 2 case: 
// Create object here and "move it up" to QML side 
// engine.rootContext()->setContextProperty("cppClass", new CppClass); 

İyi şanslar!

-1

Herhangi bir C++ kodu derlemeden QML testleri benim için çalışıyor. Benim durumda

, bir Cı başka bir amacı, left_motor adı verilen bir özelliğe sahip kontrolör nesne ++ sahiptir ve bu özellik hızı sahiptir.

hızının hızının okunabilir olduğunu, ancak yazılabilir olmadığını unutmayın. Herhangi bir güncelleme, yuvalardan gerçekleşir. QML'de buna benzer: controller.left_motor.onGuiSpeedChanged (hız)

Bunu, öğe bileşenleri, özellikler ve bazı javascript kullanarak QML ile alay edebildim.

Item {      // mock of controller 
    id: controller 
    property alias left_motor: left_motor 
    Item { 
     id: left_motor 
     property int speed: 0 
     function onGuiSpeedChanged(arg) { 
      speed = arg 
     } 
    } 
} 
property alias controller: controller 

Şimdi controller.left_motor.onGuiSpeedChanged (hız) gibi daha önce çözmek, ancak sahte fonksiyonuna içine bağlanmak için çağırır. Aramanın gerçekleştiğini bilmek için hız özelliğini bile okuyabilirim. yerine yazılabilir özelliklerinin yuvalarını kullanmak önemli olduğunu

function test_set_speed() { 
    console.log("controller.left_motor.speed: " + controller.left_motor.speed) 
    var got = page1.set_left_speed(250) 
    compare(got, 250, "set_left_speed() return incorrect") 
    console.log("controller.left_motor.speed: " + controller.left_motor.speed) 
} 

Not:

İşte benim test fonksiyonu (ı test olduğum kod page1 parçasıdır) 'dir. Bir yuvaya yapılan çağrı, bir işlev çağrısı gibi görünür ve bu şekilde alay edilebilir. Mülkiyet yazımı yapmak için bir yol bulamadım.

Yazılabilir özellikleri denemeye başladım çünkü bu, C++ ve QML bağlayıcı belgelerindeki ilk şeydi. QML ve C++'yi beklendiği gibi bağlar, ancak test için alay edilemez.

+0

Bu alan cevaplar içindir, herhangi bir sorguyu buna benzer boşluklar yapabilir veya yeni bir soru oluşturabilirsiniz. – eyllanesc

+0

Orijinal isteğim yanlış yazılmıştı, ancak bir yanıt buldum ve bunu ona düzenledim. Burada en iyi eylemden emin değilim: ya yeni bir cevap (ve ölü olanı bırakın), ya da kötü olanı düzenleyin (ve olumsuz bir skoru var). İkinciyi yaptım ama tavsiye ederim. –