将结构传递给Qt中的信号

Passing structure to signal in Qt

本文关键字:信号 Qt 结构      更新时间:2023-10-16

我想发送一个带有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>();