2013-06-25 23 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」); –