正如您已经发现的那样,您必须使用Q_DECLARE_METATYPE
使 Qt 知道该类型。
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
此外,您可能需要调用qRegisterMetaType
. 具体来说,该函数必须在使用队列信号/槽连接中的结构之前或在与QObject::property() API 一起使用之前调用。
qRegisterMetaType<StandardData>();
工作示例
标准数据.h
struct StandardData {
int EmpId;
QString Name;
}; Q_DECLARE_METATYPE(StandardData)
主文件
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>();