使用QPushButton实现具有进度展示功能的圆角矩形按钮
结果如图
网上也没有找到现成控件,只好自己动手了。
基本思路其实就是使用QBitmap绘制一个圆角矩形的笔刷在绘制好的矩形进度条上使用setMask设置遮罩。
头文件:
1 class ProgressButton : public QPushButton { 2 Q_OBJECT 3 4 void paintEvent(QPaintEvent* event) override; 5 public: 6 explicit ProgressButton(QWidget* parent); 7 int cur_ = 0; 8 signals: 9 void sig_finished(); 10 public slots: 11 void onProChanged(); 12 };
实现:
1 void ProgressButton::paintEvent(QPaintEvent* event) { 2 if(cur_ < 1 || cur_ > 99) { 3 QPushButton::paintEvent(event); 4 return; 5 } 6 QColor backColor(43, 43, 43); 7 QColor proColor(0, 222, 167); 8 9 // 绘制笔刷,这一部分其实可以放入showEvent里提前绘制好 10 QBitmap pixMask(width(),height()); 11 12 QPainter ipt(&pixMask); 13 ipt.setRenderHint(QPainter::Antialiasing); 14 ipt.fillRect(pixMask.rect(), Qt::white); 15 ipt.setPen(Qt::black); 16 ipt.setBrush(QBrush(Qt::black)); 17 ipt.drawRoundedRect(0,0,pixMask.width(),pixMask.height(),20,20); 18 19 QPainter pt(this); 20 pt.fillRect(rect(),backColor); 21 pt.setPen(proColor); 22 pt.setBrush(QBrush(proColor)); 23 pt.drawRect(0,0,width()*cur_/100,height()); 24 pt.setPen(Qt::white); 25 pt.drawText(rect(),Qt::AlignCenter,text()); 26 setMask(pixMask); 27 } 28 29 ProgressButton::ProgressButton(QWidget* parent) : QPushButton(parent){ 30 31 } 32 33 void ProgressButton::onProChanged() { 34 if(cur_>=100) { 35 QTimer* ti = qobject_cast<QTimer*>(sender()); 36 ti->stop(); 37 //cur_=0; 38 emit sig_finished(); 39 return; 40 } 41 cur_ += 1; 42 setText(QString("%1%").arg(cur_)); 43 update(); 44 }