在 qt 中传递带有信号和插槽的参数

Passing arguments with signals and slots in qt

本文关键字:信号 插槽 参数 qt      更新时间:2023-10-16

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

我想连接信号和插槽。

QObject::connect(_Requests, SIGNAL(newJobsAvailable(const MyClass &)), _Object, SLOT(doSend(const MyClass &)));

qt抱怨无法排队MyClass等。

如何正确声明它

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

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

修复它的另一种方法是注册您的类型。但是你应该在没有任何限定符的情况下执行此操作!

qRegisterMetaType<MyClass>("MyClass");

如果您使用的是 Qt5,请考虑在 MyClass 中使用Q_GADGET宏(只需将其放在类定义的开头,并将标头添加到 pro 文件中的 HEADERS)。

您需要

确保MyClass具有公共默认值和复制构造函数。因为对象可能会被复制,即使您使用 const ref 声明信号和插槽。

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