2
WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator)

これは関数シグネチャです。そして私はそれを呼んでいますQtConcurrent::run

QFuture<quint32> future = QtConcurrent::run(WMI::WMIQuery::wmiquery, _table, query);

アーキテクチャは非常に単純です。クエリによって返される予想行数は既知です。クエリは並行して実行され、各レコードフェッチで行が追加され table: WMI::WMITable* WMI::WMITableます。これはSimple QObject TableDataStructureです。それは放出rowsAboutToBeInserted(QModelIndex, int, int)rowsInserted(QModelIndex, int, int)、行を追加すると。

一方ProgressIndicator、メインスレッドでインスタンス化され、tableはそのに渡されますctor。からまでの予想される行の総数を取得しWMI::WMIQuery::wmiquery()ますProgressIndicator::setRecordCount(quint64 count)rowAdded()それはいくつかの簡単な数学をすることによって100から進歩を放出するスロットを持っています。そのctorで接続します

connect(_table, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowAdded()));

私が思うこと。別のWMI::WMIQuery::wmiquery()スレッド(上QThreadPool)で実行しているため、この接続はクロススレッドキュー接続です。私は正しいですか?

実行時に次のエラーが発生します

QObject :: connect:タイプ'QModelIndex'の引数をキューに入れることができません
('QModelIndex'がqRegisterMetaType()を使用して登録されていることを確認してください)。

私は何をすべきか ?私SLOT(rowAdded())は3つの引数を必要としないので、次のSIGNAL(rowsInserted(QModelIndex,int,int))ような別の信号を作成rowInserted()し、放出するたびにそれを放出し、代わりにこれをこの結合にrowsInserted(QModelIndex,int,int)使用する必要がありますSIGNAL

rowsInserted(QModelIndex,int,int)テーブルのデータ構造のように、なぜモデルのような信号を使用しているのかと疑問に思われるかもしれません。このテーブルに接続されているモデルもあります。これも行ごとに更新されます。しかし、私はそれがこの点で重要ではないと思います。

4

2 に答える 2

2

私はこれがかなり遅いことを知っていますが、誰かがそれを言及したことを確認したかったのです: QModelIndex はキューに入れられることを意図していません. つまり、QModelIndex を使用する前にモデルを変更すると、未定義の動作が発生します。モデル インデックスを使用してキューに入れられたイベントが必要な場合は、おそらく QPersistentModelIndex を使用する必要があります。元の質問とはあまり関係ありませんが、ここにたどり着いた人には役立つかもしれません。

于 2016-06-24T22:03:23.187 に答える
2

自明でない引数の型 ( など) を使用してスレッド境界を越えてシグナルを送信する前に、QModelIndexまずこれを呼び出す必要があります。

qRegisterMetaType<QModelIndex>("QModelIndex");

これにより、Qt がスレッド境界を越えてシグナルを送信できるようになります。

通常、これは を呼び出す前に、またはがインスタンス化されたmain()一度だけ実行される場所で行います。emitQApplication

これは、非自明な型にのみ必要です。たとえば、このような信号では、呼び出す必要はありませんqRegisterMetaType()

signals:
   void mySignal(int foo, int bar);

しかし、このようなシグナルには以下必要ですqRegisterMetaType():

signals:
   void mySignal(QModelIndex);

詳細については、こちらの Qt ドキュメントを参照してください: http://doc.qt.nokia.com/latest/qmetatype.html#qRegisterMetaType

于 2011-07-11T19:53:47.557 に答える