在QT5中的QThreads发射std :: string.q_declare_metatype



如何将std ::字符串定义为一种类型,以便我可以使用排队连接从qthread发射到另一个?

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

这里可用的其他线程之一

在这里其他线程

但所有人都将连接视为QT 4版本。(信号和插槽宏)。

现在,3年后,有QT5.2可用,即使文档说:

,我也找不到解决方案。

关于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应放置在任何类或功能之外。

文档状态:理想情况下,该宏应放在类或结构的声明下方。如果是不可能的,则可以将其放入私人标头文件中,每次在QVariant中使用该类型时都必须包括在内。

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

但是,如果您不使用模板,这都是没有用的。如文档状态:使用Q_DECLARE_METATYPE()声明新类型,以使其可用于QVariant和其他基于模板的功能。调用qRegisterMetaType()以使类型可用于基于非模板的功能,例如排队信号和插槽连接。

因此,您需要做的就是调用qRegisterMetaType,您将能够在排队连接中使用std::string。在您的连接语句之前的某个地方进行类似的事情:

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

使用q_declare_metatype。

相关内容

  • 没有找到相关文章

最新更新