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

时间:2014-02-01 20:07:25

标签: multithreading types macros qt5

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

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

Here one of the other threads available

Here other thread

但他们都将连接视为Qt 4版本。 (信号和插槽宏)。

现在,3年后,在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?

2 个答案:

答案 0 :(得分:2)

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了。在连接语句之前的某处做类似的事情:

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

答案 1 :(得分:1)

在使用Q_DECLARE_METATYPE的文件中包含qmetatype.h标头。