将结构传递给Qt中的信号
Passing structure to signal in Qt
我想发送一个带有Qt信号的结构。我该怎么做?我知道如何发送带有信号的整数、字符串、图像等,但与结构部分混淆了。我阅读了一些帖子并发现了Q_DECLARE_METATYPE(),但我不明白如何使用它。
typedef struct
{
int EmpId;
QString Name;
} StandardData;
class Data::public QObject
{
Q_DECLARE_METATYPE(StandardData);
signals:
void SignalData(const StandardData &f_objStandardCan);
}
我得到的错误1.非命名空间作用域类的显式专用化。2.模板的专用化必须出现在命名空间范围内3. 结构 QMetaTypeId 使用不同的访问权限重新声明。有人可以告诉我哪里出错了。
错误是因为Q_DECLARE_METATYPE的使用在你的类声明中。 它必须位于任何类或命名空间之外。 你只需要像这样移动它:
typedef struct
{
int EmpId;
QString Name;
} StandardData;
Q_DECLARE_METATYPE(StandardData);
正如你已经发现的,你必须使用Q_DECLARE_METATYPE
来使Qt知道该类型。
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
此外,您可能需要调用qRegisterMetaType
。具体来说,在排队的信号/插槽连接中使用结构之前,或者在与 QObject::p roperty() API 一起使用之前,必须调用该函数。
qRegisterMetaType<StandardData>();
工作示例
标准数据.h
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
主.cpp
int main(int argc, char *argv[])
{
// Register types on startup
qRegisterMetaType<StandardData>();
// Continue with the program
// ...
}
静态初始化技巧
有一个技巧可以用来调用qRegisterMetaType
而不修改任何不相关的文件(如main.cpp
)。此技巧使用静态初始化。但是,我没有找到任何Qt的文档表明这是受支持的。此外,在动态库中使用时,这可能会导致问题。
标准数据.h
// The header file looks the same as above
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
标准数据.cpp
// We don't need this global variable at all. We just want to ensure that
// qRegisterMetaType is called when the application starts.
static const int typeId = qRegisterMetaType<StandardData>();
Q_GADGET
或者,您可以使用Q_GADGET
而不是Q_DECLARE_METATYPE
:
class StandardData {
Q_GADGET
public:
int EmpId;
QString Name;
};
// You still have to call qRegisterMetaType if used for queued signals or
// as property.
qRegisterMetaType<StandardData>();
相关文章:
- Qt VTK交互风格的信号到小部件
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- Qt将信号与另一个类方法连接
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt:如何通知对象已建立涉及它的信号槽连接
- Qt/C++ 系统单元启动/停止时的信号
- C++Qt信号和插槽
- Qt moveToThread,带有参数的信号/插槽
- 如何在Qt测试框架中对信号进行基准测试?
- Qt - Q_PROPERTY的通知信号未发出有关成员更改的通知信号
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 使用std::bind将Qt信号连接到插槽
- Qt:向死/停止线程发送信号
- 呼叫函数直接与发射信号(QT-信号和插槽)
- 没有这样的插槽/信号(Qt)