Qt 信号和槽函数参数只能是基于 Qt 的基础类型的,比如 QString、int、bool 等,如果想传递自定义类型默认情况下是行不通的。要想在 Qt 的信号和槽函数之间传递自定义类型,可以先将自己的自定义类型注册一下,使用如下代码:

1
Q_DECLARE_METATYPE(nim::DocTransInfo)

nim::DocTransInfo 为你的自定义数据结构,我这里是一个结构体。当需要传递这个数据时,不是直接使用,而是用 QVariant 来包装一下,信号和槽函数则直接使用 QVariant 类型的数据作为参数传递。首先我们连接信号和槽:

1
connect(this, SIGNAL(AddDocItemSignalNew(QVariant)), this, SLOT(AddDocItemNew(QVariant)), Qt::QueuedConnection);

信号和槽函数的声明如下:

1
2
signals:
void AddDocItemSignalNew(QVariant variant);
1
2
private slots:
void AddDocItemNew(QVariant variant);

当要发起信号的时候,把我们要传递的这个数据包装到 QVariant 中,然后传递给信号函数就可以了。如下所示:

1
2
3
QVariant data;
data.setValue(file_info);
emit AddDocItemSignalNew(data);

槽函数接受到信号时可以像如下方法一样解析参数出来使用:

1
2
3
4
5
void MainForm::AddDocItemNew(QVariant variant)
{
nim::DocTransInfo doc_info = variant.value<nim::DocTransInfo>();
// ....... 其他代码
}

这样包装后,我们就可以使用 Qt 的信号和槽功能来传递自定义数据结构了。