Qt中实时更新UI程序示例

这篇具有很好参考价值的文章主要介绍了Qt中实时更新UI程序示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 概述

Qt在运行时会开启一个主线程,如果没有开启工作线程的话,所有界面上的操作都是在主线程,包括更新界面或者处理数据等操作。我们都知道如果处理数据比较多的话,最好是在单独开启一个线程来处理数据,这样就不会影响主线程的运行。

2. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

3. 实时更新UI(非信号与槽)

QT中不建议工作线程中更新界面。

workthread.h

#ifndef WORKTHREAD_H
#define WORKTHREAD_H

#include <QThread>

class MainWindow;
class QLabel;

class WorkThread : public QThread
{
    Q_OBJECT
public:
    WorkThread(QObject *parent);
    ~WorkThread();

    void setObject(MainWindow *obj);
    void setLabel(QLabel *l);
    void stop();

protected:
    void run();


private:
    MainWindow *mainObject = nullptr;
    QLabel *label = nullptr;
    int i = 0;

    volatile bool stopped = false;
};

#endif // WORKTHREAD_H

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓文章来源地址https://www.toymoban.com/news/detail-402658.html

workthread.cpp

#include "workthread.h"
#include "mainwindow.h"

#include <QLabel>
#include <QDebug>

WorkThread::WorkThread(QObject *parent):QThread(parent)
{
    stopped = false;
}


WorkThread::~WorkThread()
{

}


void WorkThread::setObject(MainWindow *obj)
{
    mainObject = obj;
}

void WorkThread::setLabel(QLabel *l)
{
    label = l;
}


void WorkThread::run()
{
    qDebug() << "线程开始运行";
    
    while(!stopped)
    {
        msleep(1);
        i++;
        //mainObject->runInThread();
        label->setText(QString("当前计数为:%1").arg(i));
    }
    //下次启动
    stopped = false;
}

//暂停线程
void WorkThread::stop()
{
    stopped = true;
    qDebug() << "线程已经暂停";
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "workthread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class WorkThread;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void runInThread();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;

    WorkThread *thread = nullptr;

    int count = 0;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "workthread.h"

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

    thread = new WorkThread(this);
    thread->setObject(this);
    thread->setLabel(ui->label);

    ui->pushButton->setEnabled(true);
    ui->pushButton_2->setEnabled(false);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::runInThread()
{
    count++;

    ui->label->setText(QString("当前计数为: %1").arg(count));
}

//启动线程
void MainWindow::on_pushButton_clicked()
{
    if (nullptr != thread)
    {
        thread->start();
    }

    ui->pushButton->setEnabled(false);
    ui->pushButton_2->setEnabled(true);
}

//暂停线程
void MainWindow::on_pushButton_2_clicked()
{
    if (nullptr != thread)
    {
        thread->stop();
    }

    ui->pushButton->setDisabled(false);
    ui->pushButton_2->setDisabled(true);
}

主界面

Qt中实时更新UI程序示例 

4. 实时更新UI(信号与槽)

workthread.h

#ifndef WORKTHREAD_H
#define WORKTHREAD_H

#include <QThread>

class MainWindow;
class QLabel;


struct Student
{
    int id;
    char sex;
    QString name;
};

//声明元类型
Q_DECLARE_METATYPE(Student)

class WorkThread : public QThread
{
    Q_OBJECT
public:
    WorkThread(QObject *parent);
    ~WorkThread();

    void stop();

protected:
    void run();

signals:
    void sigCount(Student s);

private:

    int i = 0;

    volatile bool stopped = false;
};

#endif // WORKTHREAD_H

workthread.cpp

#include "workthread.h"
#include "mainwindow.h"

#include <QLabel>
#include <QDebug>

WorkThread::WorkThread(QObject *parent):QThread(parent)
{
    //注册自定义类型
    qRegisterMetaType<Student>();

    stopped = false;
}

WorkThread::~WorkThread()
{

}

void WorkThread::run()
{
    qDebug() << "线程开始运行";

    while(!stopped)
    {
        i++;

        //发送信号
        Student s;
        s.id = i;
        s.sex = 'M';
        s.name = "lily";
        emit sigCount(s);

        msleep(1);
    }

    //下次启动
    stopped = false;
}

//暂停线程
void WorkThread::stop()
{
    stopped = true;
    qDebug() << "线程已经暂停";
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "workthread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class WorkThread;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void slotSetValue(Student s);

private:
    Ui::MainWindow *ui;

    WorkThread *thread = nullptr;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "workthread.h"

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

    thread = new WorkThread(this);

    ui->pushButton->setEnabled(true);
    ui->pushButton_2->setEnabled(false);

    connect(thread, &WorkThread::sigCount, this, &MainWindow::slotSetValue);
}

MainWindow::~MainWindow()
{
    delete ui;
}


//启动线程
void MainWindow::on_pushButton_clicked()
{
    if (nullptr != thread)
    {
        thread->start();
    }

    ui->pushButton->setEnabled(false);
    ui->pushButton_2->setEnabled(true);
}

//暂停线程
void MainWindow::on_pushButton_2_clicked()
{
    if (nullptr != thread)
    {
        thread->stop();
    }

    ui->pushButton->setDisabled(false);
    ui->pushButton_2->setDisabled(true);
}

//槽函数
void MainWindow::slotSetValue(Student( s))
{
    ui->label->setText(QString("当前值为: %1 %2 %3").arg(s.id).arg(s.sex).arg(s.name));
}

主界面

Qt中实时更新UI程序示例 

【温馨提示】

如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的作用就是用来对象与对象之间通信的,难免会跨线程,建议在使用自定义类型利用信号槽通信时,最好先通过qRegisterMetaType()将自定义类型进行注册,以免出错。

总结qRegisterMetaType使用方法如下:

1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;

2、注册方法:在当前类的顶部包含:#include ,构造函数中加入代码:qRegisterMetaType(“Myclass”);

3、Myclass的引用类型需单独注册:qRegisterMetaType(“Myclass&”);

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

到了这里,关于Qt中实时更新UI程序示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序弹幕自动滚动实时更新数据功能

    需求 最近遇到的需求,写一个弹幕功能 大致就是实现这样的效果 弹幕轮播,上下两排,一共30个弹幕,30个轮播完毕之后获取新的弹幕数据 实现方法  目前我想到的实现方法是用css的动画来实现这个功能 布局层级 给barrageBox盒子一个相对定位 给barrageList绝对定位 先将list盒子

    2024年01月20日
    浏览(47)
  • 微信小程序学习实录6(百度经纬度采集、手动调整精度、H5嵌入小程序、百度地图jsAPI、实时定位、H5更新自动刷新)

    viewport,手机端的适配; layui,手机端界面UI; jweixin-1.6.0,H5与微信小程序通信的API接口文件 getBdGeo ();定位封装函数; marker.addEventListener(\\\'dragend\\\', function () {}, 监听标注事件,手动调整景点 getCurrentPosition, 加载即自动采集当前位置的经纬度信息和城市地址信息; 通过web-view

    2024年02月05日
    浏览(63)
  • Android:实时更新时间

    心想着也就是更新精确到分钟,不用精确到秒,定时器就没有必要,系统是有广播 Intent.ACTION_TIME_TICK 可以直接用 动态注册广播 主方法里面调用一下 接收广播并处理 精确到时:分的方法 

    2024年02月15日
    浏览(108)
  • 前端大屏数据实时更新

    在页面中使用  setInterval  每隔几秒去获取一下数据。伪代码如下: 一般不建议这样使用,因为会给页面造成性能问题。 使用  websocket 如果使用 websocket 纯前端无法独立完成,需要 后台  配合提供相应的接口。 使用 SSE(Server-Sent Events) , 纯前端无法独立完成,需要 后台  配

    2024年02月05日
    浏览(62)
  • 2023最新AI创作系统/ChatGPT商业运营版网站程序源码+支持GPT4+支持ai绘画(MJ)+实时语音识别输入+免费更新版本

    1、提问:程序已经支持GPT3.5、GPT4.0接口 2、支持三种Ai绘画模型(官方Midjourney模型、GPT3.5KEY绘画、国内其他绘画模型) 3、中英文实时语音识别输入,文章资讯发布功能,菜单工具栏功能,邮箱验证和手机短信验证注册登录,邀请返佣功能。 4、新增Prompt面具角色扮演功能 5、

    2024年02月11日
    浏览(85)
  • WebSocket 网络协议(实时更新 )

    WebSocket 是一种在客户端和服务器之间建立双向通信信道的网络协议。它在客户端和服务器之间建立一个持久的、全双工的连接,允许数据在两个方向上实时传输,而不需要像HTTP一样进行多次请求和响应。  WebSocket 的主要优势是减少了服务器和客户端之间的通信延迟,因为数

    2024年01月17日
    浏览(50)
  • Python如何随数据更新实时画图?Python实时动态绘图

    在数据分析和可视化场景中,我们常常需要实现实时动态图表,比如每分钟读取数据库新的记录,及时更新图表显示最新数据,而不是静态显示某个时间点的数据。本文将介绍使用Python matploblib库的animation功能实现实时动态绘图的方法。 问题背景 我们有一个Excel表,其中记录

    2024年02月12日
    浏览(51)
  • ClickHouse如何处理实时更新

    本文通过示例介绍如何处理ClickHouse实时更新。OLAP数据库并不欢迎数据变更操作,ClickHouse也不例外,和其他OLAP产品一样,刚开始ClickHouse甚至不支持更新,更新能力是后来才加上的,但是按照ClickHouse方式增加的。当前ClickHouse更新是异步的,使得在交互应用中难以使用。有很多

    2024年02月15日
    浏览(47)
  • CTF常用工具_实时更新

    近期在做一些ctf题,其中会涉及到许多工具,起初我会使用百度网盘在每一篇博客放置对应的工具,但因网盘上传有上限,所以现在我将练习中所用到所有的工具放置在这篇文章中。 需要下载的小伙伴可随时拿取,分享有效期为永久分享。 常用工具及常用网站为实时分享!

    2024年02月04日
    浏览(46)
  • Java面试基础|数据结构 -实时更新

    1.HashMap和ConcurrentHashMap介绍 核心是一个Node数组, 数据结构与hashMap相似 使用CAS操作来实现无锁的更新,提高了并发性。当更新节点时,它会使用CAS来替换节点的值或链接,如果CAS失败,表明有其他线程也在进行修改,当前线程可以重试或锁定节点 对于复杂的结构修改操作

    2024年01月17日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包