C++ 通过排队Qt信号槽连接发送Qsharedpointer的QVector

C++ 通过排队Qt信号槽连接发送Qsharedpointer的QVector,c++,qt,C++,Qt,当我试图通过排队信号槽连接在线程之间发送QVector>时遇到了问题(Tester是我继承QObject的类) 当我试图简单地将signal\slot与QVector连接起来时,正如参数program在运行期间告诉我的那样,应该注册这个元类型(尽管QVector、QSharedPointer和从QObject继承的类应该自动注册) 我试着加上 typedef QVector<QSharedPointer<Tester> > TestPointerVector; Q_DEC

当我试图通过排队信号槽连接在线程之间发送QVector>时遇到了问题(Tester是我继承QObject的类)

当我试图简单地将signal\slot与QVector连接起来时,正如参数program在运行期间告诉我的那样,应该注册这个元类型(尽管QVector、QSharedPointer和从QObject继承的类应该自动注册)

我试着加上

typedef QVector<QSharedPointer<Tester> > TestPointerVector;
Q_DECLARE_METATYPE(TestPointerVector);
typedef QVector TestPointerVector;
Q_DECLARE_元类型(TestPointerVector);
在声明Tester类并添加到main()之后

qRegisterMetaType();
在这种情况下,qmetatype.h‚qtypeinfo.h中有编译错误,告诉我QVector>是不完整类型,并且无法计算此类向量的sizeof

做这个寄存器元类型的正确方法是什么

我的测试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();
}
intmain(intargc,char*argv[])
{
qcorea应用程序(argc、argv);
qRegisterMetaType();
接收器*rcv=新接收器(0);
发射器*emt=新发射器(0);
QThread*thread=新的QThread();
连接(rcv,信号(finished()),线程,插槽(quit());
连接(rcv,信号(finished()),rcv,插槽(deleteLater());
QObject::连接(emt、信号(发送(TestPointerVector))、rcv、,
插槽(接收(TestPointerVector)),Qt::QueuedConnection);
rcv->moveToThread(线程);
线程->开始();
emt->process();
而(!thread->isFinished())
继续;
返回a.exec();
}

发现问题,它不在qRegisterMetaType部分。问题是我在signal\slot签名中使用了Qvector,我已将其更改为const Qvector&并且一切都开始工作


若QSharedPointer在发射器线程中被删除,它仍然会被接收器接收,并且数据不会被破坏(我在这个示例中尝试测试的内容).

发现问题,它不在qRegisterMetaType部分。问题是我在signal\slot签名中使用了Qvector,我已将其更改为const Qvector&并且一切都开始工作


如果在发射器线程中删除了QSharedPointer,那么接收器仍然会接收到它,并且数据不会被破坏(我在本例中尝试测试的内容)。

\include
@jesper juhl Nope,QVector和QSharedPointer已经包括在内,所以问题不在这里。不确定这是否会影响主题中的内容,但是:
while(!thread->isFinished())继续;
是错误的。您阻止代码进入主线程代码事件循环,并且不清楚为什么
线程在该循环之前完成。@AlexandrVX这与我的问题无关,但仍然要感谢,该代码阻止了我的程序结束。
\include
@jesper juhl Nope,QVector和QSharedPointer已经包含在内,所以问题不在这里。不确定这是否会影响主题中的内容,但:
while(!thread->isFinished())继续;
是错误的。您阻止代码进入主线程代码事件循环,并且不清楚为什么
线程在此之前完成。@AlexandrVX这与我的问题无关,但仍然要感谢,该代码阻止了我的程序结束。
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();
}