将 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 - 根QGraphicsObjectQObject 【参考方案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】:

QGraphicsObjectQObject,因此不需要强制转换。如果您的编译器出现问题,请尝试添加 #include &lt;QGraphicsObject&gt;

只是在编译器不知道类的情况下进行转换是自找麻烦。 (尤其是涉及到多重继承。)

【讨论】:

【参考方案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属性的信号

C++ 和 QML:将 QML 信号连接到 C++ 插槽

无法将 Qml 信号连接到 C++ 插槽

Qt:将C ++类暴露给QML时出错

使用 PySide2 将 python 信号连接到 QML ui 插槽

Qt for Qt:如何连接到具有新信号/插槽风格的信号?