2

コードで 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()));

connect ステートメントを実行すると、「null オブジェクトに接続できません」というエラーが表示されます。デバッグ中に、「rootObject」を有効なポインターとして取得できないことがわかりました。どこが間違っていますか?

ありがとう

4

5 に答える 5

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();
        }
    }
}

もう1つ、qmlファイルの場所を確認してください。バイナリにアクセスできる必要があります。

于 2011-05-11T02:17:15.770 に答える
1

これを試すことができますか?( Qt Docsのサンプルコードです)

QObject *item = pQMLContainer->rootObject();
QObject::connect(item, SIGNAL(keyPressed()),
                  pTemp, SLOT(onKeyPressed()));
于 2011-05-10T12:56:27.327 に答える
0

おそらく、dynamic_cast の代わりに qobject_cast を使用する必要がありますか? たとえば、質問 dynamic_cast は NULL を返しますが、そうすべきではありませんを参照してください

于 2011-05-10T09:48:49.177 に答える
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 を使い始めたばかりです)。

ご支援いただきありがとうございます!モッツ

于 2011-05-12T09:42:04.427 に答える
0

QGraphicsObjectであるQObjectため、キャストは必要ありません。コンパイラが文句を言う場合は、追加してみてください#include <QGraphicsObject>

クラスが問題を求めていることをコンパイラーが認識せずにキャストするだけです。(特に、複数の継承が関係しているため。)

于 2011-05-10T13:32:13.080 に答える