最近在阅读Qt 5.9 C++开发指南,为了加深对书本上内容的理解,参照书上的讲解尝试写了一些demo,用于以后工作中查阅,如果涉及侵权请告知,实例程序samp13_1

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H #include <QThread> class MyThread : public QThread
{
Q_OBJECT private:
int _times;
int _value; protected:
void run(); public:
MyThread();
~MyThread(); signals:
void timesValueChanged(int times, int value); }; #endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
#include <QRandomGenerator> MyThread::MyThread()
{
_times = ;
_value = ;
} MyThread::~MyThread()
{ } // 这个是通过信号与槽与主窗口进行交互的,还有一种方法是通过函数
void MyThread::run()
{
while()
{
_value = QRandomGenerator::global()->generate(); // 用这个类生成随机数
_value = (_value % ) + ; // 这个类生成的数可能是负数,如果是负数就从新生成
if(_value <= )
{
continue;
} _times = _times + ;
emit timesValueChanged(_times, _value); // 发信号给主窗口,叫他显示 msleep(); // 先睡一会儿在生成数字
}
}

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H #include <mythread.h>
#include <QDialog>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QLabel> class MyDialog : public QDialog
{
Q_OBJECT private:
QPushButton *_btnStart;
QPushButton *_btnFinish;
QPushButton *_btnClearInfo;
QPlainTextEdit *_plainTextEdit;
QLabel *_labStatus;
QLabel *_labPicture;
MyThread *_thread; protected:
void closeEvent(QCloseEvent *event); public:
MyDialog(QWidget *parent = nullptr);
~MyDialog(); void iniUI();
void iniSignalSlots(); private slots:
void btnStartClicked();
void btnFinishClicked();
void btnClearInfoClicked();
void timesValueChanged(int times, int value); }; #endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QPixmap>
#include <QString> MyDialog::MyDialog(QWidget *parent) : QDialog(parent)
{
iniUI(); //创建线程
_thread = new MyThread(); iniSignalSlots();
} MyDialog::~MyDialog()
{ } // 初始化界面
void MyDialog::iniUI()
{
// 创建按钮
_btnStart = new QPushButton("启动游戏");
_btnFinish = new QPushButton("结束游戏");
_btnFinish->setEnabled(false);
_btnClearInfo = new QPushButton("清空文本"); // 布局按钮
QHBoxLayout *layout1 = new QHBoxLayout();
layout1->addWidget(_btnStart);
layout1->addWidget(_btnFinish);
layout1->addWidget(_btnClearInfo); // 创建文本框和图片显示框
_plainTextEdit = new QPlainTextEdit();
_labPicture = new QLabel();
QPixmap pixmap;
pixmap.load(":/images/d0.jpg");
_labPicture->setPixmap(pixmap); // 布局文本框和图片显示框
QHBoxLayout *layout2 = new QHBoxLayout();
layout2->addWidget(_plainTextEdit);
layout2->addWidget(_labPicture); // 创建状态栏
_labStatus = new QLabel("游戏状态:未开始"); // 布局状态栏
QHBoxLayout *layout3 = new QHBoxLayout();
layout3->addWidget(_labStatus); // 创建分组框的布局
QVBoxLayout *layout4 = new QVBoxLayout();
layout4->addLayout(layout1);
layout4->addLayout(layout2);
layout4->addLayout(layout3); // 创建一个分组框
QGroupBox *groupBox = new QGroupBox("掷骰子");
groupBox->setLayout(layout4); // 创建整体布局
QHBoxLayout *layout5 = new QHBoxLayout();
layout5->addWidget(groupBox); // 设置整体布局
setLayout(layout5);
resize(, );
} // 连接信号与槽
void MyDialog::iniSignalSlots()
{
connect(_btnStart, SIGNAL(clicked()), this, SLOT(btnStartClicked()));
connect(_btnFinish, SIGNAL(clicked()), this, SLOT(btnFinishClicked()));
connect(_btnClearInfo, SIGNAL(clicked()), this, SLOT(btnClearInfoClicked()));
connect(_thread, SIGNAL(timesValueChanged(int, int)), this, SLOT(timesValueChanged(int, int))); } void MyDialog::btnStartClicked()
{
_labStatus->setText("游戏状态:进行中");
_thread->start();
_btnStart->setEnabled(false);
_btnFinish->setEnabled(true);
} void MyDialog::btnFinishClicked()
{
_labStatus->setText("游戏状态:未开始");
_thread->terminate();
_thread->wait();
_btnStart->setEnabled(true);
_btnFinish->setEnabled(false);
} void MyDialog::btnClearInfoClicked()
{
_plainTextEdit->clear();
} // 当用户点击开始游戏后,线程就启动了,当线程生成一个数字时,会发一个信号过来,这个槽函数接受信号做出响应
void MyDialog::timesValueChanged(int times, int value)
{
QString text = QString::asprintf("第%d次掷骰子,点数为:%d", times, value);
_plainTextEdit->appendPlainText(text);
QString filename = QString::asprintf(":/images/d%d.jpg", value);
QPixmap pixmap;
pixmap.load(filename);
_labPicture->setPixmap(pixmap); // 给一个label设置图片
} void MyDialog::closeEvent(QCloseEvent *event)
{
if(_thread->isRunning()) // 如果线程还在继续执行,那么强行终止
{
_thread->terminate();
_thread->wait();
}
event->accept();
}

main.cpp

#include "mydialog.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyDialog w;
w.show(); return a.exec();
}

效果展示

QThread创建多线程程序的更多相关文章

  1. Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口

    sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...

  2. 创建多线程程序的第一种方式_创建Thread类的子类

    创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...

  3. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...

  4. Thread类的常用方法_sleep和创建多线程程序的第二种方式实现Runnable接口

    public static void sleep(long millis);//使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行). 毫秒数结束后线程继续执行 package com.yang.T ...

  5. java创建多线程(转载)

    转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对 ...

  6. 在Qt(C++)中使用QThread实现多线程

    1. 引言 多线程对于需要处理耗时任务的应用很有用,一方面响应用户操作.更新界面显示,另一方面在"后台"进行耗时操作,比如大量运算.复制大文件.网络传输等. 使用Qt框架开发应用程 ...

  7. JAVA创建多线程

    首先:线程与进程的区别是什么呢? 进程:正在运行的一个程序称之为一个进程,进程负责了内存空间的划分,从宏观的角度:windows是在同时执行多个程序 从微观的角度看,CPU是在快速的切换要执行的程序. ...

  8. 如何提高多线程程序的cpu利用率

    正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情.在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行.然后,事情确 ...

  9. 转:MFC中创建多线程

    MFC中创建多线程   MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员 ...

随机推荐

  1. VUE 动态切换列表active样式

    参考VUE官方文档样式绑定 https://cn.vuejs.org/v2/guide/class-and-style.html 需求是动态加载出来了所有菜单列表,点击其中一个li元素改变这个元素的背 ...

  2. vue的高级使用技巧

    全局组件注册 一般组件应用弊端,比较笨拙繁琐低效,比如我们写了一些组件,需要引用上的时候就通过import导入,那如果是高频繁需要使用的组件,则需要在每个使用的时候都需要引入并注册 假设现在有两个组件

  3. C语言 Win32 获取显示设备信息

    函数 BOOL EnumDisplayDevicesA( LPCSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEA lpDisplayDevice, DWORD ...

  4. 「AMPPZ2014」The Prices

    传送门 Luogu团队题链接 解题思路 看到 \(m\) 这么小,马上想到状压 \(\text{DP}\). 设 \(dp[i][j]\) 表示在前 \(i\) 家商店中已买商品的状态为 \(j\) ...

  5. AngularJs 禁止模板缓存

    因为AngularJs的特性(or 浏览器本身的缓存?),angular默认的HTML模板加载都会被缓存起来.导致每次修改完模板之后都得经常需要清除浏览器的缓存来保证浏览器去获得最新的html模板,自 ...

  6. Python中的*可变参数与**关键字参数

    1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...

  7. LR的深入理解资料汇集

    今天面试被问到LR的算法的梯度和正则化项,自己不太理解,所以找了一些相关资料,发现LR的算法在梯度下降,正则化和sigmoid函数方面都有很深的研究,期间也发现一些比较好的资料,记录一下. 这篇论文推 ...

  8. java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)(转)

    Caused by: java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录) 解决方法:修改jmeter.properites: ser ...

  9. metasploit扫描

    实验目的: 一.  基于TCP协议收集主机信息 二.  基于SNMP协议收集主机信息 三.  基于SMB协议收集信息 四.  基于SSH协议收集信息 五.  基于FTP协议收集信息     实验环境: ...

  10. Windows驱动开发-内核常用内存函数

    搞内存常用函数 C语言 内核 malloc ExAllocatePool memset RtlFillMemory memcpy RtlMoveMemory free ExFreePool