我正在尝试在代码中使用qml-grid视图。我正在尝试将它与我的C ++代码结合起来。 我动态创建了一个列表视图模型,并通过qml文件传递。它工作正常。 但是,当我想将Qml信号连接到Qt / c ++代码时,我遇到了麻烦。我在Qml矩形中处理了mouseArea并从那里发出了一个信号。
我正在尝试按如下方式连接信号:
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()));
当connect语句运行时,我收到一个错误:无法连接到“null”对象。 在调试时,我发现我永远无法将“rootObject”作为有效指针。 我哪里错了?
由于
答案 0 :(得分:1)
你能试试吗? (这是来自Qt Docs的示例代码)
QObject *item = pQMLContainer->rootObject();
QObject::connect(item, SIGNAL(keyPressed()),
pTemp, SLOT(onKeyPressed()));
答案 1 :(得分:1)
代码非常简单:
在.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文件的位置,二进制文件应该可以访问它。
答案 2 :(得分:0)
也许您应该使用qobject_cast而不是dynamic_cast?参见例如题 dynamic_cast returns NULL but it shouldn't
答案 3 :(得分:0)
QGraphicsObject
是QObject
,因此不需要演员。如果您的编译器抱怨,请尝试添加#include <QGraphicsObject>
。
只是在没有编译器知道这些类的情况下进行投射会遇到麻烦。 (特别是因为涉及多个遗传。)
答案 4 :(得分:0)
我终于可以开始工作了。我不确定这是否是问题的真正解决方案,但最终这让它运作起来: 我将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