2014-03-12 83 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文件需要调用或使用您连接信号和槽前。否则,它将无法找到该对象,这样就会得到相同的错误。