2017-07-03 50 views
0

我有以下問題: 我編寫了一個qml-GUI和一個接口類,通過在qml端連接C++端的插槽上的信號與一些C++代碼進行通信。基於事件或按鈕的觸發器工作正常,但我需要一個信號,必須在啓動時直接觸發。我通過使用我的ApplicationWindow中的Component.onCompleted來嘗試。 Howevery,產生在Component.on完成之前初始化QML信號

輸出 「setInitDrone()被稱爲」,但從未達到 getInitDrone()。 QT文檔說: 「運行onCompleted處理程序的順序未定義。」

我可以確保信號已經初始化,當我試圖發送它,或者是否有任何其他方法,而不是使用Component.onCompleted?
感謝您的幫助!


main.qml:

ApplicationWindow{ 
    id: appWindow 
    visible: true 
    minimumHeight: 800 
    minimumWidth: 700 
    visibility: Window.Maximized 

    signal setInitDrone() 

    Component.onCompleted: { 
    setInitDrone() 
    print("setInitDrone() called") 
    } 
} 

qml_cpp_interface.cpp:

void Qml_cpp_interface::getInitDrone(){ 
    qDebug() << "Cpp initDrone received"; 
    flightserver.init(); 
} 

groundstation.cpp:

QGuiApplication app(argc, argv); 

QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

//Connect with C++ code 
QObject *item = engine.rootObjects().first(); 
Qml_cpp_interface qml_cpp_interface; 

QObject::connect(item, SIGNAL(setInitDrone()), &qml_cpp_interface,SLOT(getInitDrone())); 

return app.exec(); 

回答

2

你做錯了,而不是訪問QML來自C++的東西,你應該訪問C++來自QML。

Qml_cpp_interface公開爲QML,因爲它將暴露核心邏輯接口。既然你正在做初始化,你甚至不需要信號,因爲大概你只會初始化一次,這就是「初始化」的意思。

然後,你可以簡單地通過

Component.onCompleted: Qml_cpp_interface.getInitDrone()

調用初始化另外,我看不出有任何正當理由從QML初始化,我的意思是你可以直接在C初始化++,甚至從Qml_cpp_interface含蓄「的構造函數。所以在GUI加載的時候,你已經初始化了。