簡體   English   中英

通過排隊的Qt信號槽連接發送QSharedPointers的QVector

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM