如何将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。