最近在阅读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. 阿里云配置mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客:https://blog.csdn.net/kunzai6/article/details/81938613 师兄的哈哈哈 ...

  2. Day2-L-棋盘问题-POJ1321

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  3. JavaWeb开发:从购买服务器到简单demo运行

    写这篇文章的目的: 一个是为了记录实施过程,方便自己日后查阅: 另一个是给项目组成员提供一个参考,方便他们以后搭建自己的项目环境: 当然若能帮助到更多的朋友,那就再好不过了:D 需要注意: 我本身也是 ...

  4. Echarts学习宝典

    1,可以使用百度图说中的图表代码复制到option中,还可在百度图说中以可视化的方式编辑数据,调整参数和编辑样式.(也可借助百度图说更改部分样式) 2,借助网站 https://echarts.bai ...

  5. Python 实现远程服务器批量执行命令

    paramiko 远程控制介绍 Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录.首先来看一个简单的例子 import parami ...

  6. loadrunner controller查看参数日志

    1.在generator,我们用这个语句来输出参数:lr_output_message("目录为%s", lr_eval_string("{NewParam}" ...

  7. centos 7安装nodejs

    ps: {install_path} 安装目录路径 1.安装wget yum install wget 2. 下载对应文件 wget -c https://nodejs.org/dist/v8.9.1 ...

  8. R 《回归分析与线性统计模型》page121,4.4

    rm(list = ls()) A = read.xlsx("xiti_4.xlsx",sheet = 4) names(A) = c("ord"," ...

  9. 2020寒假 05 ——eclipse安装scala环境

    在eclipse中安装Scala环境 1安装eclipse插件步骤,点击help,选择Eclipse Marketplace 2.输入Scala,点击go 3.选择搜索到的Scala IDE 4.7. ...

  10. 005、Java中使用文档注释

    01. 代码如下: package TIANPAN; /** * 此处为文档注释 * @author 田攀 微信382477247 */ public class TestDemo { public ...