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)
このチュートリアルを確認するのが最善だと思います:
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の使用方法を説明します。
この場合、 Connections を使用する必要があります(接続する唯一の方法かもしれません)。
setContextProperty
によってオブジェクトmyObjをQMLファイルに入れます
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
あなたの信号は
finishedGatheringDataForItem(QString signalString)
QMLファイルに、以下にConnectiosのいいね!を追加します。
Connections {
target: YourObject
onFinishedGatheringDataForItem: {
qmlString = signalString
}
}