目的
产品的人机交互体验对于产品来说极为重要,当程序处理时间长时,操作人员会误以为仪器异常,然后果断的断了仪器的电,此时若是正好在向磁盘写文件,这后果就可想而知了 。
分析
此时就好比是火车晚点时,乘客若能知道火车当前进展情况,自然就相对有耐心等下去,所以可以通过可动态显示图标以示程序没有“死机”,以进度条显示实时进展情况,以示仪器正在努力处理中。
实现方法:
提示界面的头文件
#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秒以内的任务。没有必要显示进度。