瞎扯
轉(zhuǎn)眼已經(jīng)折騰Qt(畫圖軟件23333)快5個月了,C++的東西沒學(xué)到多少遍希,各種軟件繪圖技巧倒是折騰了不少等曼。在剛開始工作的時候看到設(shè)計稿的軟件界面還是一臉懵逼的凿蒜,現(xiàn)在發(fā)現(xiàn)沒有什么是Qt的paint()和PS解決不了的,如果有废封,再加個Ae~ o( ̄▽ ̄)ブ
簡介
在需要按比例顯示數(shù)據(jù)的時候,進(jìn)度條是必不可少的漂洋。Qt中有一個進(jìn)度條相關(guān)的類QProgressBar,這個類提供了簡單的水平或垂直的進(jìn)度條刽漂,可以通過修改qss簡單的改變下樣式:
簡單使用的話自帶的樣式就夠看了,但是也有時候設(shè)計非要搞些酷炫的效果贝咙,沒辦法只能折騰下了......比如,設(shè)計稿非要整個兩端橢圓的進(jìn)度條庭猩,qss就沒轍了窟她。這篇文章主要總結(jié)下Qt在繪制控件方面的經(jīng)驗蔼水,畫都能畫出來了,其他騷操作就隨便搞了徙缴,下面是折騰出來的栗子:
各種進(jìn)度條
重繪paint之兩端圓角進(jìn)度條(繼承QProgressbar)
圖中第一個,其實也可以直接繼承QWidget的于样,就少寫個設(shè)置百分比和最小最大值的函數(shù),主要還是重寫paint函數(shù)穿剖,畫出進(jìn)度條底圖和根據(jù)當(dāng)前value值畫出藍(lán)色進(jìn)度條:
void RadiusProgressBar::paintEvent(QPaintEvent *)
{
QPainter p(this);
QRect rect = QRect(0, 0, width(), height()/2);
QRect textRect = QRect(0, height()/2, width(), height()/2);
const double k = (double)(value() - minimum()) / (maximum()-minimum());
int x = (int)(rect.width() * k);
QRect fillRect = rect.adjusted(0, 0, x-rect.width(), 0);
QString valueStr = QString("%1%").arg(QString::number(value()));
QPixmap buttomMap = QPixmap(":/resource/radius_back.png");
QPixmap fillMap = QPixmap(":/resource/radius_front.png");
//畫進(jìn)度條
p.drawPixmap(rect, buttomMap);
p.drawPixmap(fillRect, fillMap, fillRect);
//畫文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setPen(QColor("#555555"));
p.drawText(textRect, Qt::AlignCenter, valueStr);
}
重繪paint之純色圓環(huán)進(jìn)度條(繼承QWidget)
圖中第二個,這是單純用程序畫出來的糊余,沒有貼圖秀又,在畫出底圖的圓以及上層的圓弧后,在上層再畫一個透明的圓吐辙,相當(dāng)于遮罩:
void RingsProgressbar::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
m_rotateAngle = 360*m_persent/100;
int side = qMin(width(), height());
QRectF outRect(0, 0, side, side);
QRectF inRect(20, 20, side-40, side-40);
QString valueStr = QString("%1%").arg(QString::number(m_persent));
//畫外圓
p.setPen(Qt::NoPen);
p.setBrush(QBrush(QColor(97, 117, 118)));
p.drawEllipse(outRect);
p.setBrush(QBrush(QColor(255, 107, 107)));
p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
//畫遮罩
p.setBrush(palette().window().color());
p.drawEllipse(inRect);
//畫文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setFont(f);
p.setPen(QColor("#555555"));
p.drawText(inRect, Qt::AlignCenter, valueStr);
}
重繪paint之貼圖圓環(huán)進(jìn)度條(繼承QWidget)
圖中第三個,在玩第二種進(jìn)度條的時候尊沸,意外發(fā)現(xiàn)drawPie()設(shè)置筆刷后可以直接畫圓弧,這種騷操作 不試試還真不知道:
void RingsMapProgressbar::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
m_rotateAngle = 360*m_persent/100;
int side = qMin(width(), height());
QRectF outRect(0, 0, side, side);
QRectF inRect(20, 20, side-40, side-40);
QString valueStr = QString("%1%").arg(QString::number(m_persent));
//畫底圓
p.setPen(Qt::NoPen);
QPixmap backMap = QPixmap(":/resource/progress_back.png");
p.drawPixmap(outRect, backMap, outRect);
//畫內(nèi)弧
QPixmap frontMap = QPixmap(":/resource/progress_front.png");
p.setBrush(QBrush(frontMap));
p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
//畫文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setPen(QColor("#DDDDDD"));
p.drawText(inRect, Qt::AlignCenter, valueStr);
}
重繪paint之屬性動畫進(jìn)度條(繼承QWidget)
圖中第4個洼专,上面3個都是用程序控制顯示進(jìn)度的,最后一個是直接將進(jìn)度條動畫導(dǎo)出成序列幀圖片屁商,播放動畫的形式來畫進(jìn)度條。這種方式主要是在某些等待操作以及需要進(jìn)度條動畫有曲線的時候用的蜡镶,前提是你要會做動畫和導(dǎo)出序列幀哦(⊙o⊙):
AnimationProgressbar::AnimationProgressbar(QWidget *parent) : QWidget(parent),
m_animaindex(0),
m_animaTotal(30),
m_persent(0)
{
QPixmap aniMap(":/resource/sequence_animate.png");
for(int i=0; i<m_animaTotal; i++){
m_animalist << aniMap.copy(i*(aniMap.width()/m_animaTotal), 0, aniMap.width()/m_animaTotal, aniMap.height());
}
m_animation=new QPropertyAnimation(this,"");
m_animation->setStartValue(0);
m_animation->setEndValue(m_animaTotal - 1);
m_animation->setDuration(2000);
m_animation->setLoopCount(-1);
connect(m_animation,SIGNAL(valueChanged(QVariant)),this,SLOT(slot_valuechange(QVariant)));
}
void AnimationProgressbar::startAnimation()
{
update();
m_animation->start();
}
void AnimationProgressbar::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.setRenderHint(QPainter::SmoothPixmapTransform);
int side = qMin(width(), height());
QRect outRect(0, 0, side, side);
QRect inRect(20, 20, side-40, side-40);
QString valueStr = QString("%1%").arg(QString::number(m_persent));
//畫圓環(huán)
p.drawPixmap(outRect, m_animalist.at(m_animaindex));
//畫文字
QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
p.setFont(f);
p.setPen(QColor("#555555"));
p.drawText(inRect, Qt::AlignCenter, valueStr);
}
void AnimationProgressbar::slot_valuechange(QVariant var)
{
m_animaindex = var.toInt();
m_persent = m_animaindex*100 / m_animaTotal;
update();
}
進(jìn)度條栗子
代碼倉庫在這里->Github鏈接地址精盅,喜歡的話點下star哦~