在Qt中传递结构信号

时间:2013-10-16 07:31:43

标签: c++ qt qt-signals

我想在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使用不同的访问权限重新声明。 有人可以告诉我哪里出错了。

2 个答案:

答案 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)

工作示例

standarddata.h

qRegisterMetaType<StandardData>();

的main.cpp

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的文档说明这是支持的。此外,在动态库中使用时可能会出现问题。

standarddata.h

main.cpp

standarddata.cpp

// The header file looks the same as above
struct StandardData {
    int EmpId;
    QString Name;
}; Q_DECLARE_METATYPE(StandardData)

Q_GADGET

或者,您可以使用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>();