我想在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. struct QMetaTypeId使用不同的访问权限重新声明。 有人可以告诉我哪里出错了。
答案 0 :(得分:9)
错误是因为Q_DECLARE_METATYPE的使用在您的类声明中。它必须在任何类或名称空间之外。你只需要像这样移动它:
typedef struct
{
int EmpId;
QString Name;
} StandardData;
Q_DECLARE_METATYPE(StandardData);
答案 1 :(得分:1)
正如您已经发现的那样,您必须使用Q_DECLARE_METATYPE
来使Qt知道该类型。
num_or_size_splits
此外,您可能需要致电qRegisterMetaType
。具体来说,必须在排队信号/插槽连接中使用结构之前或在使用QObject::property() API之前调用该函数。
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
qRegisterMetaType<StandardData>();
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
有一个技巧可用于调用qRegisterMetaType
而无需修改任何不相关的文件(如int main(int argc, char *argv[])
{
// Register types on startup
qRegisterMetaType<StandardData>();
// Continue with the program
// ...
}
)。这个技巧使用静态初始化。但是,我没有找到任何Qt的文档说明这是支持的。此外,在动态库中使用时可能会出现问题。
main.cpp
// The header file looks the same as above
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
或者,您可以使用Q_GADGET
代替Q_DECLARE_METATYPE
:
// 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>();