Qt之程序长时间处理的显示技巧

本文介绍了如何通过在用户界面中添加动态显示图标和进度条来改善产品的人机交互体验,特别是在长时间处理任务时避免用户误认为程序‘死机’。通过使用QMovie和QProgressBar类,可以创建一个提示窗口,实时更新任务进度,增加用户的耐心等待。在实际应用中,根据任务类型选择是否显示进度条,并通过信号槽机制在后台线程中更新进度。
摘要由CSDN通过智能技术生成

目的

产品的人机交互体验对于产品来说极为重要,当程序处理时间长时,操作人员会误以为仪器异常,然后果断的断了仪器的电,此时若是正好在向磁盘写文件,这后果就可想而知了 。

分析

此时就好比是火车晚点时,乘客若能知道火车当前进展情况,自然就相对有耐心等下去,所以可以通过可动态显示图标以示程序没有“死机”,以进度条显示实时进展情况,以示仪器正在努力处理中。

实现方法:

提示界面的头文件

#include <QWidget>
#include <QMovie>
#include <QString>
#include <QProgressBar>
namespace Ui {
class WaitingWin;
}
//
//connect(&(*T_loadRcs),SIGNAL(s_progressuUpdate(int)),this,SLOT(progressUpdate(int)));
class WaitingWin : public QWidget
{
    Q_OBJECT
   QMovie *movie;
   QString waitinglab;
   QProgressBar* m_P_processBar;//进度条
public:
    explicit WaitingWin(QWidget *parent = 0,QString messageLab = NULL,int waitType = 0);

    ~WaitingWin();


private slots:

    void progressUpdate(int value);//显示百分比0~100
private:
    Ui::WaitingWin *ui;
    int m_waitType;
};

#endif // WAITINGWIN_H

提示界面的实现文件

#include "WaitingWin.h"
#include "ui_WaitingWin.h"
#include "WaittingWin/WaitingWin.h"
#include <QDebug>

WaitingWin::WaitingWin(QWidget *parent, QString messageLab, int waitType):QWidget(parent),ui(new Ui::WaitingWin)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);
    //加载动画
    movie = new QMovie(this);
    m_waitType = waitType;
    int ScreanWidth = parent->geometry().width();
    int ScreanHeight = parent->geometry().height();
    int movieWidth = ui->MovieLab->width();
    int movieHeight = ui->MovieLab->height();
    int remindWidth = ui->label->width();
    int remindHeight = ui->label->height();
    int processdWidth = 600;
    int processHeight = 36;
    int movieX;
    int movieY;
    int ProcessX;
    int ProcessY;
    int remindX;//提示坐标
    int remindY;

    movieX = (ScreanWidth-movieWidth)/2;
    remindX = (ScreanWidth-remindWidth)/2;
    ProcessX = (ScreanWidth-processdWidth)/2;

    movieY = ScreanHeight/2-movieHeight;
    remindY = movieY+movieHeight +40;
    ProcessY = remindY+remindHeight+40;

    switch(waitType)
    {
      case 0:
        movie->setFileName(":/gif/Image/gif/waiting1.gif");
        m_P_processBar = nullptr;
        break;
      case 1://有进度条
        movie->setFileName(":/gif/Image/gif/waiting1.gif");
        //初始化进度条
        m_P_processBar = new QProgressBar(this);
        m_P_processBar->setGeometry(ProcessX,ProcessY,processdWidth,processHeight);
        m_P_processBar->setOrientation(Qt::Horizontal);//进度条水平度
        m_P_processBar->setTextVisible(true);
        m_P_processBar->setValue(0);
        m_P_processBar->setRange(0,100);
        m_P_processBar->setStyleSheet(" QProgressBar{\
                                      font:24pt;\
                                      border-radius:5px;\
                                      text-align:center;\
                                      border:1px solid #E8EDF2;\
                                      background-color: rgb(255, 255, 255);\
                                      border-color: rgb(180, 180, 180);\
                                  }\
                                  QProgressBar:chunk{\
                                      border-radius:5px;\
                                      background-color:#1ABC9C;\
                                  }\
                                        ");
        break;
      default:
        movie->setFileName(":/gif/Image/gif/waiting1.gif");
        m_P_processBar = nullptr;
        break;
    }
    ui->MovieLab->setMovie(movie);
    ui->MovieLab->move(movieX,movieY);
    movie->start();
    //设置提示
    ui->label->move(remindX,remindY);
    ui->label->setText(messageLab);
}

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

void WaitingWin::progressUpdate(int value)
{

    if(m_P_processBar != nullptr)
    {
        //更新进度条的值
        if(value >99)
        {
            value = 100;
        }
        if(value <0)
        {
            value = 0;
        }
        m_P_processBar->setValue(value);
    }
}

调用方法:

使用方法:在线程中加调UI界面上的进度
新线程:
class BackUpCarNumberManageRunning :public QThread
{
    Q_OBJECT     //因为有信号所以必须要有此描述符
public:
    //输入数据
 struct dataIn
 {

 };
 //输出结果
 struct dataOut
 {
    int ret;   //0:没有在U盘中找到有效文件
               //1:正确
               //2:文件导入失败
 };
public:
    BackUpCarNumberManageRunning()
    {
      m_dataOutTempStr.ret = 0;
    }
    ~BackUpCarNumberManageRunning()
    {
        wait();
    }
    int setDataIn(struct dataIn *dataIn)
    {
        return 0;
    }
    int readDataOut(struct dataOut*dataOut)
    {
        dataOut->ret = m_dataOutTempStr.ret;
        return 0;
    }
protected:
    struct dataIn  m_dataInTempStr;   //启动线程时
    struct dataOut m_dataOutTempStr;  //输出结果
    void run();   //在run 中调用 emit progressUpdate(i);
//回调显示进度,发射信号,如果不需要回调,则不必写==================================
signals:
    void progressUpdate(int value);//
//=========================================================================
};
ui对象:
创建:
        waitingWinDlg = new WaitingWin(GS_mainWin,"导出车辆信息中",1);//如果不需要显示进度,则写waitingWinDlg = new WaitingWin(GS_mainWin,"导出车辆信息中",0);
        waitingWinDlg->show();

        m_BackUpCarNumberManageRunning = new BackUpCarNumberManageRunning();
        connect(m_BackUpCarNumberManageRunning,SIGNAL(finished()),this,SLOT(backUpCarNumberMessageRunning()));
        connect(m_BackUpCarNumberManageRunning,SIGNAL(progressUpdate(int)),waitingWinDlg,SLOT(progressUpdate(int)));  //########
        m_BackUpCarNumberManageRunning->start();


效果

在这里插入图片描述
注:对于处理速度相对较快的,比如在5秒以内的任务。没有必要显示进度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值