2014-03-12 80 views
2

我想在創建對象完成時發出信號。像這樣:訪問深層次的QML信號

Component.onCompleted: mySignal() 

這是位於層次結構深處的QML文件。我現在看到兩種用C++訪問這個信號的解決方案。

首先是傳遞信號了層次結構,直到main.qml,然後在C++中做到這一點:

//Create a Quick View object. 
QQuickView *view = new QQuickView(); 

//Object to access QML properties and childs. 
QObject *container = (QObject *) view->rootObject(); 

//Connect signal and slots 
QObject::connect(container, SIGNAL(mySignal()), this, SLOT(onMySignal())); 

這我都試過,由於某種原因插槽不叫。它適用於我從main.qml發送和發出的所有其他信號,但不適用於從Component.onComplete發出的信號。我可以驗證信號是從QML端發出的,但從未在C++端收到。

我嘗試的第二件事情是將信號傳遞給main.qml,而不是將信號傳遞給發出我想要的信號的QML文件。我試過這樣做:

//Create a Quick View object. 
QQuickView *view = new QQuickView(); 

//Object to access QML properties and childs. 
QObject *container = (QObject *) view->rootObject(); 

//Connect signal and slots 
QObject::connect(container->findChild<QObject*>("mySignalQmlFile"), SIGNAL(mySignal()), this, SLOT(onMySignal())); 

其中mySignalQmlFile是在其中定義了信號的主矩形的ID。

,我得到的錯誤:

的QObject ::連接:沒有這樣的信號QQuickRectangle_QML_54 :: mySignal()在.. \ GC \ mainwindow.cpp:62

我現在不知道如何繼續。

回答

1

爲了您的第一次嘗試,我認爲在您連接信號和插槽之前發出信號是可能的,這樣它就永遠不會收到信號。

第二次嘗試,您需要使用您的qml文件中的objectName,而不是「mySignalQmlFile」。

我建議你閱讀下面的教程。

http://developer.nokia.com/community/wiki/Using_objectName_to_find_QML_elements_from_Qt

此外,您的QML文件需要調用或使用您連接信號和槽前。否則,它將無法找到該對象,這樣就會得到相同的錯誤。