当我尝试发送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();
}
答案 0 :(得分:0)
发现问题,它不在qRegisterMetaType部分。问题是我正在使用Qvector&lt; ...&gt;在信号\插槽签名中,我已将其更改为const QVector&lt; ...&amp;&amp;一切都开始有效了。
如果QSharedPointer在发射器线程中被删除,它仍然会被接收器接收,数据不会被破坏(我试图通过这个例子进行测试)。