2011-07-11 5 views
2
WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator) 

これは機能シグネチャです。そして私は、アーキテクチャが非常に簡単ですQtConcurrent::runQModelIndexクロススレッドキュー接続を渡す

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はメインスレッドでインスタンス化され、tablectorに渡されます。予想される合計行数は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()のような別の信号を作成し、それを放出しなければなりません表データ構造内にある。私はこのテーブルに接続されているモデルも持っているからです。行ごとに更新されます。しかし、私はそれがこの点ではまあまあであると思う。

答えて

2

非自明な引数の型(QModelIndexのような)とスレッド境界を越えて信号を発する前に、まずこれを呼び出す必要があります:発することができるようにQtのを準備し

qRegisterMetaType<QModelIndex>("QModelIndex"); 

スレッド境界を越えた信号。

通常は、インスタンス化されたあなたQApplicationemitを呼び出すが、前に一度だけ実行されますどこかmain()または、でこれを行うだろう。

これは、自明でないタイプの場合にのみ必要です。例えば、このような信号は、qRegisterMetaType()

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

を呼び出すためにあなたを必要としない。しかし、このような信号がqRegisterMetaType()必要がないための:

signals: 
    void mySignal(QModelIndex); 

詳細はQtのドキュメントをご覧ください:http://doc.qt.nokia.com/latest/qmetatype.html#qRegisterMetaType

+0

もう一つの選択肢は、あなたがスロット 'rowAdded()'で受信していないので、発信している信号から 'QModelIndex'と' int'sを取り除くことです。 – djsmith

+0

ええ質問で言及したように私はその方法を試しました。それは働いた。 –

+0

また、qRegisterMetaType ( "QModelIndex") 'の余分なオーバーヘッドは何ですか?その問題を解決する必要がありますか?それは本当の方法ですか?または悪いハック? –

1

QModelIndexはキューイングされていないため、後で別の方法で保存して使用するのと同じ理由で、キューイングされません。つまり、QModelIndexを使用する前にモデルが変更されると、未定義の動作が発生します。モデル索引でキューに入れられたイベントが必要な場合は、おそらくQPersistentModelIndexを使用する必要があります。元の質問と実際には関係ありませんが、ここに来る人には役に立つかもしれません。

関連する問題