C++ 用qt中的信号和插槽传递参数

C++ 用qt中的信号和插槽传递参数,c++,qt,C++,Qt,我是qt的新手,我有一个问题 我想连接信号和插槽 QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &))); qt抱怨无法排队MyClass等 我如何使用正确的声明 qRegisterMetaType<const MyClass &>("const MyClass&"); qRegist

我是qt的新手,我有一个问题

我想连接信号和插槽

QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &)));
qt抱怨无法排队
MyClass

我如何使用正确的声明

qRegisterMetaType<const MyClass &>("const MyClass&");
qRegisterMetaType(“const MyClass&”);

如果Qt抱怨无法将类排队,这意味着Qt无法复制并放入类的QVariant对象中。
这只意味着只有直接连接才能工作。这是什么意思?如果您使用的是
connect
中最后一个参数的默认值,则线程之间的连接将不起作用! 将
connect
的最后一个参数设置为
Qt::DirectConnection
将使警告静音,而value
Qt::QueuedConnection
将完全无效

另一种修复方法是注册您的类型。但是你应该在没有任何限定词的情况下这样做

qRegisterMetaType<MyClass>("MyClass");
qRegisterMetaType(“MyClass”);

如果您使用QT5,则考虑使用QQGADGET宏在<代码> MyClass < /代码>(只把它放在类定义的开头,并在PRO文件中添加头到头文件)。

< p>您需要确保<代码> MyClass < /C> >具有<强>公共<强>默认和复制构造函数。因为即使使用
const ref
声明信号和插槽,也可能会复制对象


如果出于某种原因,复制是不可能的,那么按照ratchet的建议传递指针

您应该发送一个显式指针,而不是常量引用,以符合Qt标准ratchet freak:不确定您的意思。通过指针传递值类型参数肯定是个坏主意,const refs。工作正常(在大多数情况下,这是最好的选择)。这不是问题所在,但以下划线开头,后跟大写字母(
\u Requests
\u Object
)的名称以及包含两个连续下划线的名称保留给实现(编译器及其库)。不要使用它们。你应该补充一点,Q_DECLARE_METATYPE()也是必需的。对于此版本的
qRegisterMetaType
,它不是必需的。不带typeName参数的版本要求Q_DECLARE_元类型。看见