将qml信号连接到Qt

时间:2011-05-10 08:41:20

标签: c++ qt qml

我正在尝试在代码中使用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”作为有效指针。 我哪里错了?

由于

5 个答案:

答案 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)

QGraphicsObjectQObject,因此不需要演员。如果您的编译器抱怨,请尝试添加#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