Qt 线程初识别
Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。
这里我使用的是继承的方法使用线程花一个"复杂"图片的例子:
myThread.h
- #ifndef MYTHREAD_H
- #define MYTHREAD_H
- #include <QObject>
- #include <Qimage>
- class myThread : public QObject
- {
- Q_OBJECT
- public:
- explicit myThread(QObject *parent = );
- //线程处理函数
- void drawImage();
- signals:
- void updateImage(QImage temp);
- public slots:
- };
- #endif // MYTHREAD_H
myThread.cpp
- #include "myThread.h"
- #include <QPainter>
- #include <QPen>
- #include <QBrush>
- myThread::myThread(QObject *parent) : QObject(parent)
- {
- }
- void myThread::drawImage()
- {
- //定义一个绘图设备
- QImage image(,,QImage::Format_ARGB32);
- QPainter p(&image);
- QPen pen;
- pen.setWidth();
- p.setPen(pen);
- QBrush brush;
- brush.setStyle(Qt::SolidPattern);
- brush.setColor(Qt::blue);
- p.setBrush(brush);
- QPoint a[] = { QPoint(qrand()%,qrand()%),
- QPoint(qrand()%,qrand()%),
- QPoint(qrand()%,qrand()%),
- QPoint(qrand()%,qrand()%),
- QPoint(qrand()%,qrand()%) };
- p.drawPolygon(a,);
- emit updateImage(image);
- }
widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QWidget>
- #include <QThread>
- #include <Qimage>
- #include "myThread.h"
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = );
- ~Widget();
- void paintEvent(QPaintEvent *);
- void getImage(QImage temp); //槽函数
- void dealClose();
- private:
- Ui::Widget *ui;
- QImage image;
- myThread *myT;
- QThread *thread2;
- };
- #endif // WIDGET_H
widget.cpp
- #include "widget.h"
- #include "ui_widget.h"
- #include <QPainter>
- #include <QTimer>
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- myT = new myThread;
- thread2 = new QThread(this);
- myT->moveToThread(thread2);
- thread2->start();
- QTimer *timer = new QTimer(this);
- timer->start();
- connect(timer,&QTimer::timeout,myT,&myThread::drawImage);
- connect(ui->pushButton,&QPushButton::pressed,myT,&myThread::drawImage);
- connect(myT,&myThread::updateImage,this,&Widget::getImage);
- connect(this,&Widget::destroyed,this,&Widget::dealClose);
- }
- void Widget::dealClose()
- {
- thread2->quit();
- thread2->wait();
- thread2->deleteLater();
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::getImage(QImage temp)
- {
- image = temp;
- update();
- }
- void Widget::paintEvent(QPaintEvent *)
- {
- QPainter p(this);
- p.drawImage(,,image);
- }
main.cpp
- #include "widget.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- Widget w;
- w.show();
- return a.exec();
- }
Qt 线程初识别的更多相关文章
- Qt线程(2) QThread中使用WorkObject
一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用 那如果这个WorkObject是个Sing ...
- 详解 Qt 线程间共享数据(用信号槽方式)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
- Qt线程(1) moveToThread
若在Qt准备使用线程类一般有两种方式(1) 采用WorkObject配合QThread进行使用 (2)继承QThread, 重载run()函数即可. 注:采用Qt::Concurrent之类的不在本文 ...
- QT核心编程之Qt线程 (c)
QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...
- QT线程(一):线程类
线程之间共享数据,但又单独执行: QT线程QThread是平台无关的: 通常主线程从main开始执行,而在主线程中创建其他线程,其他线程派生于QThread: 1.线程优先级 总共8个优先级:线程 ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- Qt 学习之路 :Qt 线程相关类
希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必 ...
- day 64 crm项目(1) admin组件的初识别以及应用
前情提要: 今天进入项目学习阶段,crm 一个又老又土又实用的入门项目 一:django回顾 二:事前准备 1:首先创建django项目 2:在model中创建数据 from django.db im ...
- Qt 线程基础(QThread、QtConcurrent等)
[-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...
随机推荐
- 在Linux系统下用dd命令制作ISO镜像U盘启动盘
http://os.51cto.com/art/201510/494762.htm 首先在 Linux 系统中打开终端,确认 U 盘路径: sudo fdisk -l 使用 dd 命令,格式如下: s ...
- linux系统编程之(一) 信号量
信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测 ...
- Python实现图片验证码识别
转载地址:https://blog.csdn.net/EB_NUM/article/details/77060009 具体想要实现上面的代码需要安装两个包和一个引擎 在安装之前需要先安装好Python ...
- Java中forEach, 用来遍历数组
这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...
- nyoj 1192——Salvation——————【搜索】
Salvation 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身. Klaus(吸血鬼祖先) 为了利用 ...
- Java学习第二十二天
1:登录注册IO版本案例(掌握) 要求,对着写一遍. cn.itcast.pojo User cn.itcast.dao UserDao cn.itcast.dao.impl UserDaoImpl( ...
- PLC通信网络
PLC通信网络的分层 PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层.如下图所示. 在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及 ...
- Ling之select
select用法: 1.Dictionary<string, string>转json Newtonsoft.Json.JsonConvert.SerializeObject(dicSub ...
- mysql应用学习-windows(64位)安装和配置mysql(5.6.20)
下载安装包MySQL Installer 下载地址1:http://dev.mysql.com/downloads/windows/installer/ 说明:官网当前版本 5.6.22:虽然只有32 ...
- Java 匿名内部类 & 内部类
一.JAVA中内部类和匿名内部类的区别 内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用. ...