qt自定义控件-显示后台任务进度状态(带反馈)

一、前言

注:核心代码参考博主feiyangqingyun刘大师博文,在此基础上发挥自己创意,如有侵权立马删博。

本文主要介绍一种任务进度状态显示控件,即一个任务在后台执行时,等待过程中的状态显示,详细见正文

二、环境

qt5.7  windows8 

三、正文

首先上效果图

控件功能:

  1. 显示任务进度百分比
  2. 可自定义更改任务名称显示和进度条内文字描述
  3. 控件显示百分比由创建控件端控制
  4. 空闲进度条颜色,进度条宽度,进度条圆周,文字颜色,文字stylesheet等 均可以改变
  5. 如关闭进度界面,则反馈回当前进度(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下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值