gpt4 book ai didi

multithreading - 在Qt5中使用QThreads发出std::string。 Q_DECLARE_METATYPE

转载 作者:行者123 更新时间:2023-12-03 13:20:06 25 4
gpt4 key购买 nike

如何将std::string定义为类型,以便可以使用排队连接将文本从QThread发射到另一个?

我搜索并发现了许多解决此问题的线程。

Here one of the other threads available

Here other thread

但是所有人都认为该连接是Qt 4版本。 (信号和插槽宏)。

现在,三年后,有了Qt5.2,我无法找到解决方案,即使文档中说:

Docs about Q_DECLARE_METATYPE

我必须在标题中定义类型。
我尝试了Q_OBJECT的去向,并在类之外。显然是在外面工作。

我试过了:

Q_DECLARE_METATYPE<std::string>();
Q_DECLARE_METATYPE(std::string);
Q_DECLARE_METATYPE<std::string>;
Q_DECLARE_METATYPE<std::string>(anothername declared for std::string with typedef);

所有这些都给了我错误,源自:语法错误:缺少';'在之前,对于无法使用缺少的类型说明符,则假定为int。
问题始终出在这行代码上。

并且我在一个方法的同一类中使用此方法,该方法在将新线程与队列连接连接之前就注册类型:
qRegisterMetaType<std::string>();
QObject::connect(worker, &Raytracer::textEmitted, gui_, &MainWindow::addText, Qt::QueuedConnection);

我究竟做错了什么?

我必须使用QString使其工作。但是我如何使它与std::string一起工作?

最佳答案

Q_DECLARE_METATYPE应该放在任何类或函数之外。

文档状态:Ideally, this macro should be placed below the declaration of the class or struct. If that is not possible, it can be put in a private header file which has to be included every time that type is used in a QVariant .

正确的语法是Q_DECLARE_METATYPE(std::string)而没有;

但是,如果您不使用模板,那么这一切都是没有用的。如文档所述:Declare new types with Q_DECLARE_METATYPE() to make them available to QVariant and other template-based functions. Call qRegisterMetaType() to make type available to non-template based functions, such as the queued signal and slot connections.

因此,您所需要做的就是调用qRegisterMetaType,您将能够在排队的连接中使用std::string。在connect语句之前的某处执行以下操作:

qRegisterMetaType<std::string>("std::string");

关于multithreading - 在Qt5中使用QThreads发出std::string。 Q_DECLARE_METATYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502980/

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