Qt中线程的使用1

2023-11-15

初学Qt线程,此实例只是对Qt单一线程的使用,另外结合信号槽实现ui界面与子线程之间数据的传输,可以解决线程在运行的过程中,关闭对话框程序崩溃的问题。

此实例要实现的效果图如下:
在这里插入图片描述
界面控件的类,对象表如下:
在这里插入图片描述
界面启动后,起初停止线程按钮是置灰的,点击开始线程按钮,停止线程按钮不再置灰,在textBrowser中显示1 2 3 4…等数字,点击停止线程按钮会停止打印,注:点击停止线程后不会立即停止打印,而是有一定的延时,再次点击开始线程按钮,textBrowser中继续显示数字,只要显示的数字小于某一个数值,不点击停止线程按钮或者关闭对话框,线程就会一直运行,另外可以在点击开始线程按钮前后,可以点击GetTime按钮和Smile按钮。
可以分为线程类的编写,对话框类对线程的使用,代码如下:
MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
#include <QMutex>

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread(QObject * parent = nullptr);
    ~MyThread();
protected:
    void run();
public:
   void DoSomething();
   void DislaySomthing();
   void StopThread();
signals:
   void signGetTime(QString &strTime);
   void signString(const QString &str);
   void signSmileString(const QString &str);
private:
   qint32 m_a;
   bool m_Status;
   QMutex m_mutex;
};


#endif // MYTHREAD_H

MyThread.h.cpp

#include "mythread.h"
#include <QDateTime>

MyThread::MyThread(QObject * parent):QThread (parent),m_a(0),m_Status(false)
{

}

MyThread::~MyThread()
{

}

void MyThread::run()
{
    m_Status = false;
    while(m_a < 30000)
    {
        sleep(1);
        m_a++;
        emit signString(tr("%1 ").arg(m_a));

        QMutexLocker mutex(&m_mutex);
        if(m_Status)
        {
            return ;
        }
    }
}

void MyThread::DoSomething()
{
    QDateTime current_date_time =QDateTime::currentDateTime();
    QString current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
    emit signGetTime(current_date);
}

void MyThread::DislaySomthing()
{
    emit signSmileString(tr("if you belive yourself,you can do it at most persent of 99."));
}

void MyThread::StopThread()
{
    QMutexLocker mutex(&m_mutex);
    m_Status = true;
}

Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class MyThread;

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void on_pushButtonGetTime_clicked();

    void on_pushButtonSmile_clicked();

    void on_pushButtonStart_clicked();

    void on_pushButtonStop_clicked();

    void slotGetTime(QString & str);

    void slotDisplaySmile(const QString &str);

    void slotString(const QString &Str);
private:
    Ui::Dialog *ui;
    MyThread *m_Thread;
};

#endif // DIALOG_H

Dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include "mythread.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    m_Thread = new MyThread(this);
    connect(m_Thread,&MyThread::signGetTime,this,&Dialog::slotGetTime);
    connect(m_Thread,&MyThread::signSmileString,this,&Dialog::slotDisplaySmile);
    connect(m_Thread,&MyThread::signString,this,&Dialog::slotString);
}

Dialog::~Dialog()
{
    if(m_Thread->isRunning())
    {
        m_Thread->StopThread();
        m_Thread->wait();
    }
    delete ui;
}

void Dialog::on_pushButtonGetTime_clicked()
{
    m_Thread->DoSomething();
}

void Dialog::on_pushButtonSmile_clicked()
{
    m_Thread->DislaySomthing();
}

void Dialog::on_pushButtonStart_clicked()
{
     if(m_Thread->isRunning())
     {
         return ;
     }
    m_Thread->start();
    ui->pushButtonStop->setEnabled(true);
}

void Dialog::on_pushButtonStop_clicked()
{
    m_Thread->StopThread();
    ui->pushButtonStop->setEnabled(false);
}

void Dialog::slotGetTime(QString &str)
{
    ui->lineEditTime->setText(str);
}

void Dialog::slotDisplaySmile(const QString &str)
{
    ui->textEditSmile->setText(str);
}

void Dialog::slotString(const QString &Str)
{
    QString strSrc = ui->textBrowser->toPlainText();
    strSrc += Str;
    ui->textBrowser->setText(strSrc);
}

main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

以上是一个简单的线程,总结下来,继承QThread的线程类,必须在该类中重写run()函数,在run()函数中编写线程要做的事,线程启动时通过线程类对象或指针调用start()函数,线程关闭时可以使用bool变量来控制线程的关闭,也可通过quit(),wait()来等待线程的关闭,不建议使用terminate()来终止正在运行的线程,因为这样线程的终止取决于系统的调用策略,即随机调用性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中线程的使用1 的相关文章

  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • QListWidget 拖放项目从 Symbian 列表中消失

    我在实现带有可通过拖放重新排序的自定义项的 QListWidget 时遇到问题 问题是当我在某个项目上快速双击 非常短的拖放 时 该项目有时会从 QListWidget 中消失 这是我的小部件的构造函数 ListPopisiDragDrop
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q

随机推荐

  • dhcp协议配置练习

    路由器配置 配置接口ip地址 配置地址池 开启dhcp全局映射 结果 Pc1 Pc2 Pc3 Pc4
  • postman中post请求正常,但是利用postman生成C#后台http模拟代码之后调用失败问题记录

    postman中post请求正常 但是利用postman中code功能生成C 后台代码之后 填入C 后台失败 postman中code生成的代码引用的是RestSharp Restful Client开发 RestSharp帮助类 post
  • vue特性 is ref

    is属性 使用is标签解决页面中出现的小bug 例如下面的例子 div table tbody tbody table div
  • Linux INPUT 子系统实验

    目录 input 子系统 input 子系统简 input 驱动编写流程 input event 结构体 硬件原理图分析 实验程序编写 修改设备树文件 按键input 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测
  • springBoot打印请求信息日志,如请求头,请求体,请求路径等

    背景 和前端联调 前端总是说接口对了呀 后端说 没有进我的方法呀 后端加日志拦截所以请求 过程 springmvc代码 包装类中报错getReader has already been called for this request 代码里
  • @RefreshScope注解底层源码分析

    写在前面 最近在研究Spring Cloud和Spring Cloud Alibaba源码 在看到Nacos的配置中心的时候 有注意到自动刷新配置的玩法 底层实现依靠 RefreshScope注解 那么为什么要写这篇文章呢 笔者认为 Ref
  • 关于使用Tensorflow时,Optimizer定义的位置不正确时出现的错误

    参考 1 https github com tensorflow tensorflow issues 7244 2 https stackoverflow com questions 47765595 tensorflow attempti
  • 基于Echarts的数据可视化大屏

    本项目学习于b站up主 视频链接 up主分享的资料 gitee仓库 其中有笔记 笔记链接 项目总结 项目主要分为前端页面的布局和Echarts图表的嵌入 页面主要就是css较为繁琐 图表毕竟官网有模板 操作较为简单 以后有时间会利用爬虫的数
  • 西安电子科技大学第二届程序设计新生赛-F-zxy的长跑【欧拉回路】

    题目链接 好极了的欧拉回路 我们想知道怎样才能跑完所有的边 我们可以从度为奇数的点出发 因为这是欧拉回路的无向图的先觉调节 当然 这道题还有另外一种可能就是这是一个环 1 gt 2 2 gt 3 3 gt 4 4 gt 1 那么就没有奇数度
  • 《java开发高频面经总结大合集》你想要的都在这里了

    前言 很多人说到面试 头一下就大了 各种不自信 是实力不够还是信心不够 面试除了你平时不断积累实力 另一方面也需要讲究面试方法和技巧 我特别喜欢一句话 不打没有准备的战 为帮助开发者们提升面试技能 有机会入职BAT等大厂公司 所以 我采访了
  • 100流明相当于多少w_1990年的100元,相当于2020年的多少钱?

    1990年距今已经30年了 可以说我国是发生了翻天地覆的变化 不管是从经济水平还是老百姓的收入水平都是这样 在80年代的时候 也许 万元户 代表的就是 有钱人 而到了90年代 家庭财富超过万元的已经可以说是比较多了 起码相比80年代来说的话
  • 2023华为OD机试真题【施肥问题】

    解题思路 首先需要计算每个果园的施肥时间 即果园面积除以施肥机能效 然后找到最小的施肥机能效 保证施肥任务能在规定时间内完成 如果施肥天数小于果园数量 则无法完成施肥任务 返回 1 如果施肥天数等于果园数量 则直接返回最大果园面积 对果园面
  • 汇编语言实现跑马灯 8051单片机

    通过一位 F 的16进制 转换为 2进制的 1111 然后移动一位 有三极管开关所改变 0的时候发光 1的时候变暗 所以一开始0FFH表示高8位为0 低8位为1111 1111 表示全暗 然后右移变为1111 1110亮第一个等 之后类推
  • 推荐这款神器!每年都有数以百万的大学生想用它!闲鱼都卖两百!

    文末有下载链接 如同明日将死那样生活 如同永远不死那样求知 甘地 image 这是一个能把破解者气死的软件 辛辛苦苦破解的软件 却被别人拿去收费标价200元 真买了 吃亏的是你 在我这 不用钱 说到论文翻译 真的是让人抓狂 每年百万的大学生
  • 【stm32】wifi ESP8266的透传 实验二(HAL库开发)

    一 总算完成了透传 感觉没几行代码 就是在昨天的基础上 对ESP8266的AT指令进行了封装 什么选择工作模式 STA 还是 AP 查询附近WIFI热点 连接WIFi 见解服务器的IP和端口 开启透传 我的代码的缺点 1 有点简单粗暴 逻辑
  • 教你使用gitee+PicGo+typora搭建免费的Markdown图床

    文章目录 创建gitee仓库 设置私人令牌 下载PicGo typora设置 测试时出错可能原因 注意 gitee添加了防盗链 屏蔽外链访问 注意 gitee添加了防盗链 屏蔽外链访问 注意 gitee添加了防盗链 屏蔽外链访问 现使用阿里
  • [西湖论剑2021中国杭州网络安全技能大赛]Yusa的秘密 writeup

    西湖论剑2021 Yusa的秘密 Sakura组织即将进攻地球 此时你意外得到了该组织内某个成员的电脑文件 你能从中发现本次阴谋所用的关键道具吗 注 题目中包含了五个彩蛋 且彩蛋对解题本身没有任何影响 快去发现吧 附件 Who am I z
  • 【数据结构】图文详解11道力扣链表OJ题

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 移除链表元素 二 反转链表 三 链表的中间节点 四 链表中倒
  • 【H5】 实现调用相机拍照功能

    H5 实现调用相机拍照功能 效果图如下 实现代码如下
  • Qt中线程的使用1

    初学Qt线程 此实例只是对Qt单一线程的使用 另外结合信号槽实现ui界面与子线程之间数据的传输 可以解决线程在运行的过程中 关闭对话框程序崩溃的问题 此实例要实现的效果图如下 界面控件的类 对象表如下 界面启动后 起初停止线程按钮是置灰的