Qt 多线程/多窗口 参数传递

原创 2018年04月14日 23:39:39

· 重要的事情放前边说

  • 只能用 信号 - 槽 机制
  • 只能用 信号 - 槽 机制
  • 只能用 信号 - 槽 机制
  • 自己定义的数据结构要另当别论
  • 自己定义的数据结构要另当别论
  • 自己定义的数据结构要另当别论
  • Qt支持的数据类型如 QString、int、double 什么的…
  • Qt支持的数据类型如 QString、int、double 什么的…
  • Qt支持的数据类型如 QString、int、double 什么的…

· 主线程 ===> 子线程(传递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支持的数据类型)

参考博文:Qt窗体之间相互传值的三种方式


· 子窗口 ===> 主窗口(传递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();
}

第三步:开始尽情的传参数吧

略..


· 总结

多总结,多练习,多看别人的文档
站在巨人的肩膀上很重要,但是也要学会怎么找肩膀


· 联系作者

邮箱:Neverland_LY@163.com

2018年4月14日 晚

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34719188/article/details/79945717

QT多线程简单实现及变量传递

QT自定义信号与槽 自定义信号与槽 Qt多线程简单实现 多线程间变量传递
  • hyw11002233
  • hyw11002233
  • 2016-11-15 10:49:35
  • 5088

QT学习笔记18多线程

通常情况下,应用程序都是在一个线程中执行操作。但是,当调用一个耗时操作(例如,大批量I/O或大量矩阵变换等CPU密集操作)时,用户界面常常会冻结。而使用多线程可以解决这一问题。 多线程有以下几个优势:...
  • lzjsqn
  • lzjsqn
  • 2017-02-08 20:09:33
  • 495

QT 多窗口編程實例

  • 2011年11月18日 11:13
  • 12KB
  • 下载

Qt编写多窗口程序实例

  • 2016年12月24日 00:06
  • 8KB
  • 下载

Qt5基础(二)编写Qt多窗口程序笔记

笔记中的所有资料原作者:yafeilinux(QT开源社区) 1.tr()函数 01:ui->pushButton->setText(tr("新窗口")); 为了简便,一般会直接在代码中使用中文,...
  • zhaoyuaiweide
  • zhaoyuaiweide
  • 2017-07-14 19:45:05
  • 628

编写Qt多窗口程序

转自:http://www.qter.org/portal.php?mod=view&aid=27 一、添加主窗口 1.首先打开Qt Creator,新建Qt Widgets Appli...
  • daaikuaichuan
  • daaikuaichuan
  • 2017-04-08 20:24:02
  • 3543

win32窗口实现的多显示器多窗口多线程OpenGL程序源代码

  • 2008年11月23日 16:47
  • 7KB
  • 下载

OpenGL多线程多视图的实现

OpenGL在MFC下的多视图显示在很多场合都能用到,而且表现力够强。前段时间自己需要做一个类似于MAX之类的场景编辑工具,用来编辑自己正在做的FPS游戏中所需要的场景。由于自己不懂美工、不会用MAX...
  • BugRunner
  • BugRunner
  • 2010-01-26 20:39:00
  • 8584

qt线程通信(通过信号触发来传递参数)

最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI。所以,网络通信端采用新开线程的方式。在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦。网上提供了很多同一线程不同类间采用信号...
  • u014430031
  • u014430031
  • 2017-08-31 21:45:39
  • 886
收藏助手
不良信息举报
您举报文章:Qt 多线程/多窗口 参数传递
举报原因:
原因补充:

(最多只允许输入30个字)