本文介绍Qt编程中采用signal传递自定义数据类型(结构体类型)。
Qt编程中可以通过signal传递标准类型,如常见的int,QString,bool类型,有时候需要传递特定的数据类型如结构体,Qt是不支持直接传递的,若将其分开进行传递,变量太多,造成程序编写麻烦。这里介绍2种方法使signal可以传递自定义数据类型。
1.采用QVariant进行封装的方法
1)定义自定义数据类型
这里定义我们要传递的自定义数据类型,即1个结构体类型。
cpp
typedef struct _TEST
{
int a;
int b;
bool c;
}TEST;
Q_DECLARE_METATYPE(TEST);
注意这里需要采用Q_DECLARE_METATYPE()宏对新定义的类型进行声明。
2)定义相应的signal和slot
cpp
signals:
void sgnParams(QVariant var);
//other classes
slots:
void slotParams(QVariant var);
这里的形参为QVariant类型,因此,我们要将新定义的类型封装成QVariant类型。
3)封装
因为我们要采用QVariant类型进行传递,因此需要将结构体封装成QVariant类型。在相应的函数中采用如下方式处理:
cpp
TEST test;
QVariant var;
test.a = 300;
test.b = 200;
test.c = false;
var.setValue(test);
Q_EMIT sgnParams(var);
4)读取
在对应的槽函数中,对采用QVariant类型的数据进行读取。可采用如下方式进行处理:
cpp
TEST test;
if (var.canConvert<TEST>()) {
test = var.value<TEST>();
//process
}
2.注册自定义数据类型的方法
1)定义自定义数据类型
这里定义我们要传递的自定义数据类型,即1个结构体类型。
cpp
typedef struct _TEST
{
int a;
int b;
bool c;
}TEST;
2)构造函数中注册新类型
cpp
qRegisterMetaType<TEST>("TEST");
在相应的构造函数种注册我们刚定义的新类型。
2)定义相应的signal和slot
cpp
signals:
void sgnParams(TEST test);
//other classes
slots:
void slotParams(TEST test);
注意这里的形参直接采用自定义数据类型,因为我们已经向系统注册了这种新类型。
3)发送
cpp
TEST test;
test.a = 300;
test.b = 200;
test.c = false;
Q_EMIT sgnParams(test);
发送直接赋值即可。
4)接收
cpp
qDebug() << test.a << test.b << test.c;
接收直接获取形参值,和标准类型操作一样的。
总结,本文节介绍了Qt编程中采用signal传递自定义数据类型的2种方法。