gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:43 35 4
gpt4 key购买 nike

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

当我尝试简单地将 signal\slot 与这样的 QVector 连接时,参数程序在运行期间告诉我们应该注册这个元类型(尽管 QVector、QSharedPointer 和从 QObject 继承的类应该自动注册。

我试过添加

typedef QVector<QSharedPointer<Tester> > TestPointerVector;
Q_DECLARE_METATYPE(TestPointerVector);

在声明 Tester 类后添加到 main()

qRegisterMetaType<TestPointerVector>();

在那种情况下,我在 qmetatype.h 和 qtypeinfo.h 中有编译错误,告诉我 QVector > 是不完整的类型,并且无法计算此类 vector 的 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();
}

最佳答案

发现问题,不是在 qRegisterMetaType 部分。问题是我在信号\插槽签名中使用了 Qvector<...>,我将其更改为 const QVector<...>& 并且一切都开始工作了。

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

关于c++ - 通过排队的 Qt 信号槽连接发送 QSharedPointers 的 QVector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44736810/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com