最近在阅读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. JS动态获取 Url 参数

    此操作主要用于动态 ajax 请求 1.首先封装一个函数 GetRequest(),能动态获取到 url 问号"?"后的所有参数 , function GetRequest() { ...

  2. 【Python基础知识】【语法】【入门】

    一.Python概述 Python是一门面向对象的编程语言,拥有强大丰富的库,没有操作系统的限制,是一种优美.清晰的编程语言. 二.Python基础语法 1.Python标识符 标识符就是程序中定义的 ...

  3. 黑马客户管理系统(SSM)

    黑马客户管理系统 1系统概述 1.1系统功能介绍 本系统后台使用SSM框架编写,前台页面使用当前主流的Bootstrap和jQuery框架完成页面信息展示功能(关于Bootstrap的知识,有兴趣的读 ...

  4. Python 3网络爬虫开发实战书籍

    Python 3网络爬虫开发实战书籍,教你学会如何用Python 3开发爬虫   本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.reques ...

  5. Linux之文件传输

    本文借鉴<Linux命令大全> 1. bye命令 功能:终端FTP连线并结束程序 语法:bye 补充:在ftp模式下,输入bye即可中断目前的连线作业,并结束ftp的执行. 2. ftp命 ...

  6. leetcode236 Lowest Common Ancestor of a Binary Tree

    """ Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in ...

  7. bootstrap修改数据刷新页面跳转到当前页的问题

    修改按钮的页面的方法里添加如下代码 1      var pn = $("#datatable").bootstrapTable('getOptions').pageNumber; ...

  8. 题解 nflsoj489 【六校联合训练 CSP #15】小D与随机

    题目链接 考虑枚举好点的集合.此时要考虑的问题是如何填入\(1\sim n\)这些数使得恰好我们枚举到的这些点是好点,即:求出有多少种合法的填数方案. \(1\)号点一定是好点.那么除\(1\)号点外 ...

  9. 前端学习(20)~css布局(十三)

    常见的布局属性 (1)display 确定元素的显示类型: block:块级元素. inline:行内元素. inline-block:对外的表现是行内元素(不会独占一行),对内的表现是块级元素(可以 ...

  10. CentOS configuration uses the SFTP server

    SFTP,即 SSH 文件传输协议( SSH File Transfer Protocol ),或者说是安全文件传输协议( Secure File Transfer Protocol ).SFTP 是 ...