Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。 
这里我使用的是继承的方法使用线程花一个"复杂"图片的例子:

myThread.h

  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3.  
  4. #include <QObject>
  5. #include <Qimage>
  6.  
  7. class myThread : public QObject
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit myThread(QObject *parent = );
  12.  
  13. //线程处理函数
  14. void drawImage();
  15.  
  16. signals:
  17. void updateImage(QImage temp);
  18.  
  19. public slots:
  20. };
  21.  
  22. #endif // MYTHREAD_H

myThread.cpp

  1. #include "myThread.h"
  2. #include <QPainter>
  3. #include <QPen>
  4. #include <QBrush>
  5.  
  6. myThread::myThread(QObject *parent) : QObject(parent)
  7. {
  8.  
  9. }
  10.  
  11. void myThread::drawImage()
  12. {
  13. //定义一个绘图设备
  14. QImage image(,,QImage::Format_ARGB32);
  15.  
  16. QPainter p(&image);
  17.  
  18. QPen pen;
  19. pen.setWidth();
  20. p.setPen(pen);
  21. QBrush brush;
  22. brush.setStyle(Qt::SolidPattern);
  23. brush.setColor(Qt::blue);
  24. p.setBrush(brush);
  25.  
  26. QPoint a[] = { QPoint(qrand()%,qrand()%),
  27. QPoint(qrand()%,qrand()%),
  28. QPoint(qrand()%,qrand()%),
  29. QPoint(qrand()%,qrand()%),
  30. QPoint(qrand()%,qrand()%) };
  31.  
  32. p.drawPolygon(a,);
  33.  
  34. emit updateImage(image);
  35. }

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5. #include <QThread>
  6. #include <Qimage>
  7. #include "myThread.h"
  8.  
  9. namespace Ui {
  10. class Widget;
  11. }
  12.  
  13. class Widget : public QWidget
  14. {
  15. Q_OBJECT
  16.  
  17. public:
  18. explicit Widget(QWidget *parent = );
  19. ~Widget();
  20. void paintEvent(QPaintEvent *);
  21.  
  22. void getImage(QImage temp); //槽函数
  23. void dealClose();
  24.  
  25. private:
  26. Ui::Widget *ui;
  27. QImage image;
  28. myThread *myT;
  29. QThread *thread2;
  30. };
  31.  
  32. #endif // WIDGET_H

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPainter>
  4. #include <QTimer>
  5.  
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11.  
  12. myT = new myThread;
  13. thread2 = new QThread(this);
  14. myT->moveToThread(thread2);
  15. thread2->start();
  16.  
  17. QTimer *timer = new QTimer(this);
  18. timer->start();
  19. connect(timer,&QTimer::timeout,myT,&myThread::drawImage);
  20.  
  21. connect(ui->pushButton,&QPushButton::pressed,myT,&myThread::drawImage);
  22. connect(myT,&myThread::updateImage,this,&Widget::getImage);
  23.  
  24. connect(this,&Widget::destroyed,this,&Widget::dealClose);
  25. }
  26.  
  27. void Widget::dealClose()
  28. {
  29. thread2->quit();
  30. thread2->wait();
  31.  
  32. thread2->deleteLater();
  33. }
  34.  
  35. Widget::~Widget()
  36. {
  37. delete ui;
  38. }
  39.  
  40. void Widget::getImage(QImage temp)
  41. {
  42. image = temp;
  43. update();
  44. }
  45.  
  46. void Widget::paintEvent(QPaintEvent *)
  47. {
  48. QPainter p(this);
  49. p.drawImage(,,image);
  50. }

main.cpp

  1. #include "widget.h"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. Widget w;
  8. w.show();
  9.  
  10. return a.exec();
  11. }

Qt 线程初识别的更多相关文章

  1. Qt线程(2) QThread中使用WorkObject

    一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用 那如果这个WorkObject是个Sing ...

  2. 详解 Qt 线程间共享数据(用信号槽方式)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

  3. Qt线程(1) moveToThread

    若在Qt准备使用线程类一般有两种方式(1) 采用WorkObject配合QThread进行使用 (2)继承QThread, 重载run()函数即可. 注:采用Qt::Concurrent之类的不在本文 ...

  4. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  5. QT线程(一):线程类

      线程之间共享数据,但又单独执行: QT线程QThread是平台无关的: 通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread: 1.线程优先级 总共8个优先级:线程 ...

  6. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  7. Qt 学习之路 :Qt 线程相关类

    希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必 ...

  8. day 64 crm项目(1) admin组件的初识别以及应用

    前情提要: 今天进入项目学习阶段,crm 一个又老又土又实用的入门项目 一:django回顾 二:事前准备 1:首先创建django项目 2:在model中创建数据 from django.db im ...

  9. Qt 线程基础(QThread、QtConcurrent等)

    [-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...

随机推荐

  1. 在Linux系统下用dd命令制作ISO镜像U盘启动盘

    http://os.51cto.com/art/201510/494762.htm 首先在 Linux 系统中打开终端,确认 U 盘路径: sudo fdisk -l 使用 dd 命令,格式如下: s ...

  2. linux系统编程之(一) 信号量

    信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测 ...

  3. Python实现图片验证码识别

    转载地址:https://blog.csdn.net/EB_NUM/article/details/77060009 具体想要实现上面的代码需要安装两个包和一个引擎 在安装之前需要先安装好Python ...

  4. Java中forEach, 用来遍历数组

    这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...

  5. nyoj 1192——Salvation——————【搜索】

    Salvation 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身. Klaus(吸血鬼祖先) 为了利用 ...

  6. Java学习第二十二天

    1:登录注册IO版本案例(掌握) 要求,对着写一遍. cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImpl( ...

  7. PLC通信网络

    PLC通信网络的分层 PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层.如下图所示. 在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及 ...

  8. Ling之select

    select用法: 1.Dictionary<string, string>转json Newtonsoft.Json.JsonConvert.SerializeObject(dicSub ...

  9. mysql应用学习-windows(64位)安装和配置mysql(5.6.20)

    下载安装包MySQL Installer 下载地址1:http://dev.mysql.com/downloads/windows/installer/ 说明:官网当前版本 5.6.22:虽然只有32 ...

  10. Java 匿名内部类 & 内部类

    一.JAVA中内部类和匿名内部类的区别 内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用. ...