WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator)
これは機能シグネチャです。そして私は、アーキテクチャが非常に簡単ですQtConcurrent::run
QModelIndexクロススレッドキュー接続を渡す
QFuture<quint32> future = QtConcurrent::run(WMI::WMIQuery::wmiquery, _table, query);
を通してそれを呼び出しています。 クエリによって返される予定の行数がわかります。 クエリが並行して実行され、各レコードフェッチで行が追加されますtable: WMI::WMITable*
WMI::WMITable
は単純なQObjectテーブルのデータ構造です。 行を追加すると、rowsAboutToBeInserted(QModelIndex, int, int)
とrowsInserted(QModelIndex, int, int)
が出力されます。
一方、ProgressIndicator
はメインスレッドでインスタンス化され、table
はctor
に渡されます。予想される合計行数はWMI::WMIQuery::wmiquery()
からProgressIndicator::setRecordCount(quint64 count)
になります。 スロットにはrowAdded()
があり、簡単な数学を実行することで100の進捗状況を出します。それは接続します。
connect(_table, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowAdded()));
私はどう思いますか。 WMI::WMIQuery::wmiquery()
私は別のスレッド(QThreadPool
)上で実行していますが、この接続はクロススレッドキュー接続です。私は正しいですか?
私は、実行時に次のエラーを取得しています
型の引数をキューイングすることはできませんのQObject ::接続: 'QModelIndex'
(。確認してください 'QModelIndex' qRegisterMetaTypeを使用して登録されている())
どうすればよいですか?私SLOT(rowAdded())
がSIGNAL(rowsInserted(QModelIndex,int,int))
の3つの引数を必要としないので、私はrowsInserted(QModelIndex,int,int)
ような信号のようなモデルを使用していますなぜ私は
あなたが求めることができるrowsInserted(QModelIndex,int,int)
を放出し、このcoinnectionのため、代わりにこのSIGNAL
を使用していたときに私はrowInserted()
のような別の信号を作成し、それを放出しなければなりません表データ構造内にある。私はこのテーブルに接続されているモデルも持っているからです。行ごとに更新されます。しかし、私はそれがこの点ではまあまあであると思う。
もう一つの選択肢は、あなたがスロット 'rowAdded()'で受信していないので、発信している信号から 'QModelIndex'と' int'sを取り除くことです。 – djsmith
ええ質問で言及したように私はその方法を試しました。それは働いた。 –
また、qRegisterMetaType( "QModelIndex") 'の余分なオーバーヘッドは何ですか?その問題を解決する必要がありますか?それは本当の方法ですか?または悪いハック? –