【问题标题】:Connecting qml-signals to Qt将 qml 信号连接到 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

标签: c++ qt qml


【解决方案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)。

      感谢大家的支持! 莫斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多