访问层次结构深处的QML信号

时间:2014-03-12 09:30:35

标签: c++ qt qml signals-slots

我正在尝试在完成创建对象时发出信号。像这样:

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 :: connect:没有这样的信号QQuickRectangle_QML_54 :: mySignal()in .. \ GC \ mainwindow.cpp:62

我现在不确定如何继续。

1 个答案:

答案 0 :(得分:1)

首次尝试时,我认为在您连接信号和插槽之前可能会发出信号,以便从未接收到信号。

第二次尝试时,您需要使用qml文件中的objectName,而不是#34; mySignalQmlFile&#34;。

我建议你阅读以下教程。

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

此外,在连接信号和插槽之前,需要调用或使用qml文件。否则,它将无法找到该对象,因此您将收到相同的错误。