qml信号连接到Qt
我想在我的代码中使用qml网格视图。我试图将它与我的C++代码结合起来。 我已经动态创建了一个列表视图模型,并通过qml文件传递。它工作正常。 但是,当我想要将Qml信号连接到Qt/C++代码时,我遇到了麻烦。我在我的Qml-rectangle中处理了mouseArea并从那里发出信号。qml信号连接到Qt
我试图连接到信号如下:
QDeclarativeView *pQMLContainer = NULL;
TempWidget *pTemp = new TempWidget();
pQMLContainer = new QDeclarativeView(pTemp);
pQMLContainer->setResizeMode(QDeclarativeView::SizeRootObjectToView);
pQMLContainer->rootContext()->setContextProperty("imgModel", createModel());
pQMLContainer->setSource(QUrl("../Temp/qml/gridview-example.qml"));
QObject *rootObject = dynamic_cast<QObject*>pQMLContainer->rootObject();
QObject::connect(rootObject, SIGNAL(keyPressed()), pTemp, SLOT(onKeyPressed()));
当连接语句运行时,我得到一个错误:无法连接到“空”的对象。 在调试时,我发现我永远不会得到“rootObject”作为有效的指针。 我哪里错了?
谢谢
我终于可以得到这个工作。我不确定这是否是问题的真正解决方案,但最终它得到它的工作: 我设置qml路径作为我的工作文件夹的相对路径。是的,路径确实是正确的,因为我可以看到qml及其内容。我刚好从相对于工作文件夹中的QML路径更改为相对于“QRC”为:
pQMLContainer->setSource(QUrl("qrc:/gridview-example.qml"));
instead of:
pQMLContainer->setSource(QUrl("../Temp/qml/gridview-example.qml"));
,并开始工作。我不确定是否必须将qml添加到qrc(我刚开始使用qml)。
感谢大家的支持! Mots
也许你应该使用qobject_cast而不是dynamic_cast?见例如问题 dynamic_cast returns NULL but it shouldn't
感谢您的信息,但即使使用qobject_cast,我也没有得到有效的指针。我也尝试从rootObject得到一个QGraphicsObject *,但我仍然得到一个空指针。 – 2011-05-10 10:20:58
你可以试试吗? (它是从Qt Docs例如代码)
QObject *item = pQMLContainer->rootObject();
QObject::connect(item, SIGNAL(keyPressed()),
pTemp, SLOT(onKeyPressed()));
这正是我想要的,但我得到空... – 2011-05-12 09:34:27
QGraphicsObject
是QObject
所以没有铸造应要求。如果您的编译器抱怨,请尝试添加#include <QGraphicsObject>
。
只是在没有编译器知道类的情况下进行投射就是在寻求麻烦。 (特别是作为有涉及多重继承。)
的代码是非常直接:
在.cpp文件:
ui->declarativeView->setSource(QUrl("qrc:/Resources/main.qml"));
QGraphicsObject *obj = ui->declarativeView->rootObject();
connect (obj, SIGNAL(clicked()), this, SLOT(itemClicked()));
和QML文件:
import Qt 4.7
Rectangle {
width: 100
height: 100
id: rect
signal clicked
Text {
text: "Hello World"
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
rect.clicked();
}
}
}
一个更事情,检查你的qml文件的位置,它应该可以访问的二进制文件。
是的Qml是可访问的,因为我可以看到它的内容.. – 2011-05-12 09:34:56
好的,您可以尝试将一个objectName属性分配给Qml中的根对象,而不是使用rootObject,请尝试通过objectName – 2011-05-16 12:56:14
查找对象,如果应用程序无法从给定路径访问Qml文件 – 2011-05-16 12:56:48
不需要'dynamic_cast' - 根'QGraphicsObject'是'QObject'。 – laalto 2011-05-10 10:39:30