一:前言
说起自定义,是令人激动人心的,因为我们可以根据自己的需要定制任意自己需要的控件外观和控件的功能。
二:自定义控件的步骤
1,首先需要继承自己已有的原控件;
2,重写控件的绘图函数,绘制自己需要的内容:void paintEvent(QPaintEvent*event);
3,既然是继承原控件,所以就要先绘制原控件,调用父控件绘制原控件;
4,继续在void paintEvent(QPaintEvent *event)中绘制自己需要的内容;
5,定义外部调用的接口函数,用于操作绘制的内容;
6,添加原有的控件,提升原有的控件为继承后的控件,接下来的所有都可以和之前的所有操作一样啦。
三:QProgress自定义源代码
1,myProgress的头文件
#ifndef MYPROGRESS_H
#define MYPROGRESS_H
#include <QWidget>
#include <QProgressBar>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QRect>
#include <QTimer>
#include <QDebug>
#include <QString>
class myProgress : public QProgressBar
{
Q_OBJECT
public:
explicit myProgress(QWidget *parent = 0);
void setProgressBarText(QString str,QString finshed,QString end); //设置需要绘制的文本
protected:
void paintEvent(QPaintEvent *event); //绘制自己需要的内容
private:
QString text,finshValue,endValue; //绘制的文本内容
};
#endif // MYPROGRESS_H
2,myProgress的源文件
#include "myprogress.h"
myProgress::myProgress(QWidget *parent) :
QProgressBar(parent)
{
//清空文本的内容
text.clear();
finshValue.clear();
endValue.clear();
}
//重写绘制函数
void myProgress::paintEvent(QPaintEvent *event)
{
QProgressBar::paintEvent(event); //继承之前的,所以就要重新绘制之前的内容
QPainter painter(this); //定义一个画家
QPen pen; //定义一个画笔
painter.setPen(pen); //为画家添加画笔
QRect rect(this->width()/3,this->height()/3,this->width(),this->height()); //设置绘制的区域
painter.drawText(rect,text+" "+finshValue+endValue);//绘制自定义文本
}
void myProgress::setProgressBarText(QString str,QString finshed,QString end)
{
//设置需要绘制的文本内容
text=str;
finshValue=finshed;
endValue=end;
//重新绘制界面
update();
}
3,主界面
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "myprogress.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void timeoutSlot();
private:
Ui::Widget *ui;
QTimer timer;
int count;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
timer.start(500); //开启定时器,定时的增加进度条的数字
ui->progressBar->setMaximum(100); //设置进度条的最大值为100
count=0; //计数初始值初始化为0
connect(&timer,SIGNAL(timeout()),this,SLOT(timeoutSlot())); //关联定时器的槽函数
ui->progressBar->setTextVisible(false); //进度条本身的百分比不显示
}
Widget::~Widget()
{
delete ui;
}
void Widget::timeoutSlot()
{
count++;
if(count>100)
{
count=0;
}
ui->progressBar->setValue(count); //设置进度条的值
//自定义要显示的文本
ui->progressBar->setProgressBarText("text",QString::number(count).append("/"),QString::number(100));
}
四:运行效果图