2011-05-10 169 views
1

我想在我的代码中使用qml网格视图。我试图将它与我的C++代码结合起来。 我已经动态创建了一个列表视图模型,并通过qml文件传递。它工作正常。 但是,当我想要将Qml信号连接到Qt/C++代码时,我遇到了麻烦。我在我的Qml-rectangle中处理了mouseArea并从那里发出信号。qml信号连接到Qt

我试图连接到信号如下:

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”作为有效的指针。 我哪里错了?

谢谢

+0

不需要'dynamic_cast' - 根'QGraphicsObject'是'QObject'。 – laalto 2011-05-10 10:39:30

回答

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

0

也许你应该使用qobject_cast而不是dynamic_cast?见例如问题 dynamic_cast returns NULL but it shouldn't

+0

感谢您的信息,但即使使用qobject_cast,我也没有得到有效的指针。我也尝试从rootObject得到一个QGraphicsObject *,但我仍然得到一个空指针。 – 2011-05-10 10:20:58

1

你可以试试吗? (它是从Qt Docs例如代码)

QObject *item = pQMLContainer->rootObject(); 
QObject::connect(item, SIGNAL(keyPressed()), 
        pTemp, SLOT(onKeyPressed())); 
+0

这正是我想要的,但我得到空... – 2011-05-12 09:34:27

0

QGraphicsObjectQObject所以没有铸造应要求。如果您的编译器抱怨,请尝试添加#include <QGraphicsObject>

只是在没有编译器知道类的情况下进行投射就是在寻求麻烦。 (特别是作为有涉及多重继承。)

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文件的位置,它应该可以访问的二进制文件。

+0

是的Qml是可访问的,因为我可以看到它的内容.. – 2011-05-12 09:34:56

+0

好的,您可以尝试将一个objectName属性分配给Qml中的根对象,而不是使用rootObject,请尝试通过objectName – 2011-05-16 12:56:14

+0

查找对象,如果应用程序无法从给定路径访问Qml文件 – 2011-05-16 12:56:48