2011-05-10 217 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