文章目录
注意
- Qt 传递参数只能用 信号 - 槽 机制
- Qt 可以直接传递自己支持的数据类型,如 QString、int、double 什么的…
- Qt 传递自己定义的数据结构要另当别论
传递 Qt 支持的数据类型
主线程 ===> 子线程
//主线程 MyWidget.cpp 构造函数里这么写
MYThread *thread;
//在 MyWidget.cpp 构造函数里这么写
···
int i = 666;
QString qStr("Qt");
emit transferData(i , qStr); //主线程发送信号,携带参数
···
//子线程 MyThread.h 里这么写
public:
void getTransferData(int & );
private:
int mInt;
//在 MyThread.cpp 文件中实现
void getTransferData(int & data1){
···
mInt = data; //子线程收到参数
···
}
注意事项:
1、emit 释放信号可以携带参数,参数数量任意
2、子线程可以接收 从第一个信号开始依次向后的任意多参数
3、在主线程 connect 信号和槽
子线程 ===> 主线程
- 和上面类似,不多说,主要就是信号和槽的机制
主窗口 ===> 子窗口
- 参考博文:Qt窗体之间相互传值的三种方式
子窗口 ===> 主窗口
- 参考博文:Qt窗体之间相互传值的三种方式
传递自己定义的数据类型
直接举例说明,比如说我定一个经纬度数据类型 GPSData ,成员有经度、纬度、高度
第一步:定义数据类型
#ifndef GPSDATA_H
#define GPSDATA_H
//必须包含QMetaType!!!否则会出现下面错误:
//error: expected constructor, destructor, or type conversion before ‘;’ token
#include <QMetaType> //就是这个头文件,很重要!!!
#include <QString>
class GPSData
{
public:
GPSData();
GPSData(QString,QString,QString,QString,QString,QString,QString);
QString getLongitude;
QString getLatitude;
QString getAltitude;
private:
QString longitude;
QString latitude;
QString altitude;
};
Q_DECLARE_METATYPE(GPSData) //一定要添加这个宏 !!!!很重要!!!!
//宏后面不需要加 ; (分号)
#endif // GPSDATA_H
第二步:在 main 函数中注册该数据类型
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w; //这就是展示的主窗口
//注册数据类型(这句话太他妈重要了)
qRegisterMetaType<GPSData>("GPSData"); //注册后,可以使用赋值类型
qRegisterMetaType<GPSData>("GPSData&"); //注册后,可以使用引用类型
//指针类型怎么使用自己去尝试一下吧
w.show();
return a.exec();
}
第三步:开始传参数
略…
总结
多总结,多练习,多看别人的文档
站在巨人的肩膀上很重要,但是也要学会怎么找肩膀