web-dev-qa-db-ja.com

QtのQMLスロットへのC ++信号

C++からQMLファイルのスロットに信号を送信したい。プリミティブ型パラメーターなしで既に機能していますが、QStringをQMLスロットに送信したい場合、接続中にエラーが発生します。

Main.cppで接続します

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));

私のqmlファイルの関連部分

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}

エラー:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
51
alex

このチュートリアルを確認するのが最善だと思います:

http://doc.qt.io/qt-4.8/qtbinding.html

特にこのセクション:

http://doc.qt.io/qt-4.8/qtbinding.html#receive-signals

この場合のあなたの間違いは、それをスロットとして宣言しなかったか、呼び出し可能にしたのではないかと思います。両方のオプションはQtチュートリアルで説明されています。

また、C++とQMLの間でデータを交換するには、QVariantを使用する必要があります。タイプを登録することもできます。ウィジェットなど、QMLで長方形のような「ネイティブ」タイプとして使用できるようにします。 QMLインターフェイスでは表示できない特定のexternクラスまたはデータが必要な場合を除き、ほとんどの場合、これは推奨されません。

QVariantの理由は、QMLのスクリプトベースのアプローチです。 QVariantには基本的にデータとデータ型の説明が含まれているため、QMLはそれを適切に処理する方法を知っています。そのため、String、intなどを使用してQMLでパラメーターを指定する必要があります。ただし、C++との元のデータ交換はQVariantのままです

以前にqmlRegisterTypeを使用しましたが、単純なデータ型には非常に不便なソリューションです。むしろ、QMLがQStandardItemModelsをネイティブにサポートまたは拡張しないカスタムウィジェット、キャンバス、またはビデオ要素など、より複雑なデータに使用されます。 QStandardItemModelはGUIを自動的に更新するため、QMLとC++の間でデータを交換するより便利な方法であり、最初のインスタンスでシグナルやスロットを必要としません。 QStandardItemModelを使用するには、タイプをqmlRegisterType ..で登録する必要があります。このモデルは、ListViewなどのモデルベースビューで使用できます。

このトピックのチュートリアルを添付し、QListModelの使用方法を説明します。

http://doc.qt.io/qt-4.8/qdeclarativemodels.html

35
mmoment

この場合、 Connections を使用する必要があります(接続する唯一の方法かもしれません)。

  1. setContextPropertyによってオブジェクトmyObjをQMLファイルに入れます

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
  2. あなたの信号は

    finishedGatheringDataForItem(QString signalString)
    
  3. QMLファイルに、以下にConnectiosのいいね!を追加します。

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
35
Ken