在Qt中信号和槽使用自定义的结构时,运行的时候发现报错不能识别结构体
解决办法:
- 一定要将自定义结构体定义为typedef struct
- 使用
Q_DECLARE_METATYPE(结构体名)
,将结构体注册为元对象 - 使用QVariant打包数据并发送
- 在槽函数中将QVariant解包成自定义的结构体,即可使用
例子:
在datainfo.h文件中这样定义结构体
typedef struct search_list
{
QString url;
QString name;
QDateTime startTime;
QDateTime endTime;
qint64 Time;
}search_list;
Q_DECLARE_METATYPE(search_list)
videosave.h文件
signals:
void videosaveListaddSignal(const QVariant varValue);
record.h文件
public slots:
void serchList_add(const QVariant varValue);
将信号和槽链接
connect(my_videosave,SIGNAL(videosaveListaddSignal(QVariant)),my_record, SLOT(serchList_add(QVariant)));
发送信号:
videosave.cpp文件
search_list list;
...填充list...
QVariant varValue = QVariant::fromValue(list); //使用QVariant打包数据
emit videosaveListaddSignal(varValue);
槽函数接收信号:
record.cpp文件
void record::serchList_add(const QVariant varValue)
{
if (varValue.canConvert<search_list>())
{
search_list list = varValue.value<search_list>(); //将QVariant解包后得到search_list结构体
}
}