将 qml 信号连接到 Qt
Posted
技术标签:
【中文标题】将 qml 信号连接到 Qt【英文标题】:Connecting qml-signals to Qt 【发布时间】:2011-05-10 08:41:19 【问题描述】:我正在尝试在我的代码中使用 qml-grid 视图。我正在尝试将它与我的 C++ 代码结合起来。 我已经动态创建了一个列表视图模型并通过了 qml 文件。它工作正常。 但是,当我想将 Qml 信号连接到 Qt/c++ 代码时,我遇到了麻烦。我已经在我的 Qml-rectangle 中处理了 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()));
当连接语句运行时,我得到一个错误:无法连接到“空”对象。 在调试时,我发现我永远无法将“rootObject”作为有效指针。 我哪里错了?
谢谢
【问题讨论】:
不需要dynamic_cast
- 根QGraphicsObject
是QObject
。
【参考方案1】:
你可以试试这个吗? (这是来自Qt Docs的示例代码)
QObject *item = pQMLContainer->rootObject();
QObject::connect(item, SIGNAL(keyPressed()),
pTemp, SLOT(onKeyPressed()));
【讨论】:
【参考方案2】:代码非常简单:
在 .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 中将 objectName 属性分配给根对象,而不是使用 rootObject,尝试通过 objectName 查找对象 这主要发生在应用程序无法从给定路径访问 Qml 文件时【参考方案3】:也许您应该使用 qobject_cast 而不是 dynamic_cast?参见例如问题 dynamic_cast returns NULL but it shouldn't
【讨论】:
感谢您的信息,但即使在使用 qobject_cast 之后,我也没有得到有效的指针。我还尝试从 rootObject 获取 QGraphicsObject*,但仍然得到一个空指针。【参考方案4】:QGraphicsObject
是 QObject
,因此不需要强制转换。如果您的编译器出现问题,请尝试添加 #include <QGraphicsObject>
。
只是在编译器不知道类的情况下进行转换是自找麻烦。 (尤其是涉及到多重继承。)
【讨论】:
【参考方案5】:我终于可以让它工作了。我不确定这是否是问题的真正解决方案,但最后这让它工作了: 我将 qml 路径设置为我的工作文件夹的相对路径。是的,路径确实是正确的,因为我可以看到 qml 及其内容。我只是碰巧将qml路径从相对于工作文件夹更改为相对于“qrc”为:
pQMLContainer->setSource(QUrl("qrc:/gridview-example.qml"));
instead of:
pQMLContainer->setSource(QUrl("../Temp/qml/gridview-example.qml"));
它开始工作了。我不确定是否必须将 qml 添加到 qrc(我刚刚开始使用 qml)。
感谢大家的支持! 莫斯
【讨论】:
以上是关于将 qml 信号连接到 Qt的主要内容,如果未能解决你的问题,请参考以下文章
Qt Qml连接到Context属性的QObject属性的信号