一、前言
注:核心代码参考博主feiyangqingyun刘大师博文,在此基础上发挥自己创意,如有侵权立马删博。
本文主要介绍一种任务进度状态显示控件,即一个任务在后台执行时,等待过程中的状态显示,详细见正文
二、环境
qt5.7 windows8
三、正文
首先上效果图
控件功能:
- 显示任务进度百分比
- 可自定义更改任务名称显示和进度条内文字描述
- 控件显示百分比由创建控件端控制
- 空闲进度条颜色,进度条宽度,进度条圆周,文字颜色,文字stylesheet等 均可以改变
- 如关闭进度界面,则反馈回当前进度(int),以便于控制端处理事件。
核心代码:
控件头文件:
#ifndef LOADING_H
#define LOADING_H
#include <QMainWindow>
#include <QWidget>
#include <QPushButton>
#include <QSpacerItem>
#include "ProgressARC/ProgressARC.h"
namespace Ui {
class Loading;
}
class Loading : public QWidget
{
Q_OBJECT
public:
explicit Loading(QWidget *parent = 0);
~Loading();
signals:
void ProgressOver(double num);
protected:
void paintEvent(QPaintEvent* event);
public slots:
void settext(QString text);
void setstyle(QString style);
public Q_SLOTS:
//设置范围值
void setRange(double minValued, double maxValued);
void setRange(int minValued, int maxValued);
//设置最大最小值
//void setMinValue(double minValue);
//void setMaxValue(double maxValue);
//设置目标值
void setValue(double valued);
void setValue(int valued);
//设置精确度
void setPrecision(int precisiond);
//设置开始旋转角度
void setStartAngle(int startAngled);
//设置结束旋转角度
void setEndAngle(int endAngled);
//设置圆弧颜色
void setArcColor(const QColor &arcColord);
//设置文本颜色
void setTextColor(const QColor &textColord);
//设置标题颜色
void setTitleColor(const QColor &titleColord);
//设置基准颜色
void setBaseColor(const QColor &baseColord);
//设置背景颜色
void setBgColor(const QColor &bgColord);
//设置百分比模式
void setPercent(bool percentd);
//设置圆弧宽度
void setArcWidth(int arcWidthd);
//设置标题
void setTitle(const QString &titled);
private slots:
void on_pushButton_13_clicked();
void closeEvent(QCloseEvent *event);
private:
ProgressARC *Progress;
QLabel *label;
QGridLayout *gridLayout;
QPushButton *pushButton_13;
};
#endif // LOADING_H
cpp:
#include "loading.h"
Loading::Loading(QWidget *parent) :
QWidget(parent)
{
resize(300,100);
//ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setWindowModality(Qt::ApplicationModal);
this->setAttribute(Qt::WA_TranslucentBackground, true);//实现半透明先设置全透,在paint里在重绘
label = new QLabel(this);
pushButton_13 = new QPushButton("×");
pushButton_13->setFixedHeight(30);
pushButton_13->setFixedWidth(50);
pushButton_13->setStyleSheet("QPushButton:enabled {background-color: rgb(221, 0, 0);color: rgb(255, 255, 255);}\
QPushButton:enabled:hover{background-color: rgb(240, 0, 0);color: rgb(255, 255, 255);}\
QPushButton:enabled:pressed{background-color: rgb(221, 0, 0);color: rgb(255, 255, 255);}");
connect(pushButton_13,SIGNAL(clicked()),this,SLOT(on_pushButton_13_clicked()));
gridLayout=new QGridLayout();
Progress=new ProgressARC;
Progress->show();
Progress->setAttribute(Qt::WA_DeleteOnClose);
Progress->setMinimumSize(100,100);
Progress->setMaximumSize(100,100);
gridLayout->addWidget(Progress,0,0,3,3);
gridLayout->addWidget(label,1,3,1,3);
gridLayout->addWidget(pushButton_13,0,6,1,1);
gridLayout->setContentsMargins(0,0,0,0);//设置外间距
setLayout(gridLayout);
}
Loading::~Loading()
{
//delete ui;
}
void Loading::paintEvent(QPaintEvent *event)
{
//创建绘画对象
QPainter painter(this);
//为窗口添加一个半透明的矩形遮罩
painter.fillRect(this->rect(),QColor(160,160,160,235));
}
/设置等待框的文字样式
void Loading::settext(QString text)
{
label->setText(text);
}
void Loading::setstyle(QString style)
{
label->setStyleSheet(style);
}
/设置等待框的进度条样式/
//设置范围值
void Loading::setRange(double minValued, double maxValued)
{
Progress->setRange(minValued,maxValued);
}
void Loading::setRange(int minValued, int maxValued)
{
Progress->setRange(minValued,maxValued);
}
//设置目标值
void Loading::setValue(double valued)
{
Progress->setValue(valued);
}
void Loading::setValue(int valued)
{
Progress->setValue(valued);
}
//设置精确度
void Loading::setPrecision(int precisiond)
{
Progress->setPrecision(precisiond);
}
//设置开始旋转角度
void Loading::setStartAngle(int startAngled)
{
Progress->setStartAngle(startAngled);
}
//设置结束旋转角度
void Loading::setEndAngle(int endAngled)
{
Progress->setEndAngle(endAngled);
}
//设置圆弧颜色
void Loading::setArcColor(const QColor &arcColord)
{
Progress->setArcColor(arcColord);
}
//设置文本颜色
void Loading::setTextColor(const QColor &textColord)
{
Progress->setTextColor(textColord);
}
//设置标题颜色
void Loading::setTitleColor(const QColor &titleColord)
{
Progress->setTitleColor(titleColord);
}
//设置基准颜色
void Loading::setBaseColor(const QColor &baseColord)
{
Progress->setBaseColor(baseColord);
}
//设置背景颜色
void Loading::setBgColor(const QColor &bgColord)
{
Progress->setBgColor(bgColord);
}
//设置百分比模式
void Loading::setPercent(bool percentd)
{
Progress->setPercent(percentd);
}
//设置圆弧宽度
void Loading::setArcWidth(int arcWidthd)
{
Progress->setArcWidth(arcWidthd);
}
//设置标题
void Loading::setTitle(const QString &titled)
{
Progress->setTitle(titled);
}
//关闭
void Loading::on_pushButton_13_clicked()
{
this->close();
}
//只要界面被关闭,就发送当前的进度条值
void Loading::closeEvent(QCloseEvent *event)
{
double aaa=Progress->getValue();
emit ProgressOver(aaa);
}
在调用界面中,以mainwindow为例:
创建自定义控件:
Loading *load;
load=new Loading;
load->show();
load->setAttribute(Qt::WA_DeleteOnClose);
connect(load,SIGNAL(ProgressOver(double)),this,SLOT(loadingover(double)));
load->settext("速度一般般");
load->setstyle("font: 75 20pt");
load->setTitle("加速");
load->setTextColor(Qt::red);
load->setTitleColor(Qt::blue);
load->setArcColor(Qt::darkYellow);
中断状态界面后反馈的槽函数:
void MainWindow::loadingover(double num)
{
qDebug()<<num;
loadstart=0;
}
控制端控制进度函数:
load->setValue(loadstart);
剩下一部分圆形进度条的代码,在另一个文件中,本文就不放代码了,是在刘大侠的核心代码中有分享。
四、结语
自定义控件,我来啦ProgressARC.rar-QT代码类资源-CSDN下载