2013-06-25 6 views
5

POSIXスレッドを使用して別のワーカースレッドを使用してテーブルの値を更新しようとしています。複数のスレッド間でテーブル項目を設定する

スレッドが実行されている労働者は次の操作を実行しようとしている機能:

ui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value))); 

しかし、実行時に、私は次のエラーを取得する:

QObject::connect: Cannot queue arguments of type 'QVector<int>' 
(Make sure 'QVector<int>' is registered using qRegisterMetaType().) 

私はどのように非常にわからないんだけどqRegisterMetaTypeが動作します。私はどのように私はワーカーに直接ワーカースレッドを許可することができます誰か考えているかどうかは疑問に思っていますか?

+0

これについて[ここ](http://stackoverflow.com/questions/7872578/how-to-properly-use-qregistermetatype-on-a-class-derived-from-qobject)に関する議論があります。簡単に言えば、これはQtにユーザや外部ソースによって定義された他のタイプについて「知らせる」ために使用されます。通常は、信号とスロットに必要です。 – Huy

答えて

5

メインスレッド以外のウィジェットからアクセスすることは、Qtでは許可されていません。すべてのUI操作は、メインスレッド内から行う必要があります(ただし、QImageでペイントするなどの例外はあります)。

新しいアイテムを追加する場合は、ワーカースレッドで信号を送信します。メインスレッドでは、アイテムを実際に作成するスロット、つまりui->table->setItem(0,0,new QTableWidgetItem(tr("%1").arg(value)));を呼び出します。その後、単に信号とスロットを一緒にconnect()します。 Qtは、送信者と受信者が異なるスレッドで動作し、QueuedConnectionを自動的に使用することを認識します。スロットは、Qtのメインスレッドがイベントループに戻るたびに呼び出されます。

信号にパラメータがある場合は、タイプをqRegisterMetaTypeに登録する必要があります。

+0

ヘルプをよろしくお願いします。私はちょっとしたグーグルで、ウィジェット内からマルチスレッドを削除しなければならないことに気づきました。 'qRegisterMetaType'がどのようにして構造体を登録するために使われているかの例を提供できますか? – sj755

+1

構造体の登録は簡単です。qRegisterMetaTypeのドキュメントを参照してください。例:qRegisterMetaType ( "MyStruct"); –

関連する問題