2012-01-12 15 views
39

QMLファイルのC++からSlotへ信号を送信したい。 QMLスロットにQStringを送信したいのであれば、接続している間にエラーが発生しますが、プリミティブ型のパラメータを使用せずに動作しています。QtのQMLスロットへのC++信号

私はエラー

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

私のQMLファイルのrelavant一部が

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

:私はあなたがこれをチェックすると、それが最善だと思う

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString) 
+1

updateViewWithItemにQString引数はありませんか? (エラーが指摘している) – Bart

+0

申し訳ありません、テスト後にもう一度忘れてしまいました。まだ動作しません。私は、updateViewWithItem(QString)とupdateViewWithItem(string)を試しました。 – alex

+1

C++からのシグナルは、C++ライブラリまたはQtクラスを意味します??? – UmNyobe

答えて

28

チュートリアル:

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

特にこのセクション:

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

を、私はこのケースであなたの間違いがどちらかあなたがスロットとしてそれを宣言していないか、あなたはそれが呼び出し可能作らなかったということかもしれないと思います。どちらのオプションもQtチュートリアルで説明されています。

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

QVariantの理由は、QMLのスクリプトベースのアプローチです。 QVariantには基本的にデータとデータ型の記述が含まれているため、QMLは正しく処理する方法を知っています。 QMLで元のデータ交換はQVariantのままです。

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

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

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

+0

QDeclarativeViewサブクラスはここでは使用しません。私が私の質問で指摘したように、私はパラメータを省略するだけですべて動作します。 QStringをQMLに何らかの形で導入する必要がありますか? – alex

+3

その場合は、QVariantを使用してみてください。私はQMLがQVariant以外の他のデータ型を認識しないというこの問題を2,3回持っていました。 – mmoment

+0

ねえ、それは私のために問題を解決!それでももっと良い解決策があるのだろうかと思っています。これまでqmlRegisterTypeを使用しようとしましたか? – alex

25

あなたは(多分それは接続するための唯一の方法です)、この場合に接続を使用する必要があります。

  1. Connectiosは以下好き追加、あなたの信号はQMLファイルで

    finishedGatheringDataForItem(QString signalString) 
    
  2. ある `setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb); 
    
  3. `によってQMLファイルにこのmyobjあなたのオブジェクトを置く:

    Connections { 
        target: YourObject 
        onFinishedGatheringDataForItem: { 
         qmlString = signalString 
        } 
    } 
    
+0

QMLファイルはどこですか? – HorusKol

+0

データが頻繁にまたは大量に交換されると、UIで遅延が発生する可能性があります。 – mmoment

+2

SIGNAL SLOTが必ずしも良好なパフォーマンスを発揮するとは限りません。したがって、最適化するには、SIGNALを使用する前にデータを処理する必要があります。場合によっては、2つのスレッド間で接続すると、SIGNALを非常に高い速度で送信しないようにすると、UIがスタックすることになります。あなたは送信の頻度を制御する仕組みを作るべきです(タイマや遅延を使うかもしれません)。 – Ken

関連する問題