通过排队的Qt信号槽连接发送QSharedPointers的QVector

时间:2017-06-24 13:16:21

标签: c++ qt

当我尝试发送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&gt;是不完整的类型,并且无法计算这种向量的大小。

什么是正确的方法来执行此注册元类型的事情?

我的测试主要()看起来如下:

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();
}

1 个答案:

答案 0 :(得分:0)

发现问题,它不在qRegisterMetaType部分。问题是我正在使用Qvector&lt; ...&gt;在信号\插槽签名中,我已将其更改为const QVector&lt; ...&amp;&amp;一切都开始有效了。

如果QSharedPointer在发射器线程中被删除,它仍然会被接收器接收,数据不会被破坏(我试图通过这个例子进行测试)。

相关问题