[英]Sending QVector of QSharedPointers through queued Qt signal-slot connection
當我嘗試通過排隊的信號槽連接在線程之間發送QVector>時遇到了問題(Tester是我繼承QObject的類)
當我嘗試簡單地將signal \\ slot連接到這樣的QVector時,因為參數programm在運行期間告知應該注冊此元類型(盡管QVector,QSharedPointer和從QObject繼承的類應該自動注冊。
我試過添加
typedef QVector<QSharedPointer<Tester> > TestPointerVector;
Q_DECLARE_METATYPE(TestPointerVector);
聲明Tester類並添加到main()之后
qRegisterMetaType<TestPointerVector>();
在那種情況下,我在qmetatype.h和qtypeinfo.h中編譯錯誤,告訴我QVector>是不完整的類型,並且無法計算這種向量的sizeof。
什么是正確的方法來做這個注冊metatype的事情?
我的測試main()如下所示:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qRegisterMetaType<TestPointerVector>();
Receiver* rcv = new Receiver(0);
Emitter* emt = new Emitter(0);
QThread* thread = new QThread();
QObject::connect(rcv, SIGNAL(finished()), thread, SLOT(quit()));
QObject::connect(rcv, SIGNAL(finished()), rcv, SLOT(deleteLater()));
QObject::connect(emt, SIGNAL(send(TestPointerVector)), rcv,
SLOT(receive(TestPointerVector)), Qt::QueuedConnection);
rcv->moveToThread(thread);
thread->start();
emt->process();
while(!thread->isFinished())
continue;
return a.exec();
}
發現問題,它不在qRegisterMetaType部分。 問題是我在信號\\插槽簽名中使用Qvector <...>,我已將其更改為const QVector <...>&並且一切都開始工作了。
如果在發射器線程中刪除了QSharedPointer,它仍然會被接收器接收,並且數據不會被破壞(我試圖通過這個例子測試)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.