Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤(pán)
本文實(shí)例為大家分享了Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤(pán)的具體代碼,供大家參考,具體內(nèi)容如下
先看效果圖:

思路:外圍的線共100根(自定義,可改變),總共占270度,然后按照 先畫(huà)一條線然后旋轉(zhuǎn)坐標(biāo)系的思路畫(huà)出完整的線。內(nèi)部即是一個(gè)灰色的背景圓,一個(gè)圓弧和中間的value對(duì)應(yīng)的文字。
關(guān)鍵代碼:CMPassrate2.cpp
void CMPassrate2::paintEvent(QPaintEvent *event){//界面繪制事件
int width = this->width();
int height = this->height();
int side = qMin(width, height);
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.translate(width / 2, height / 2);
painter.scale(side / 200.0, side / 200.0);
drawBGE(&painter); //畫(huà)背景圓
drawTextE(&painter);//畫(huà)文字所在圓弧
drawText(&painter);//畫(huà)文字
drawLines(&painter);//畫(huà)最外部的線
}
void CMPassrate2::updateValue(float value){//提供給外部的方法,用于更新value
this->value = value;
update();//每次更新value后,都重繪界面
}
void CMPassrate2::drawLines(QPainter* painter){
painter->save();
QPen pen;
pen.setColor(QColor("#A7DD42"));
pen.setWidth(2);
painter->setPen(pen);
float range = 270.0/lineCount; //自定義所有的線加起來(lái)占270度,100條線
painter->rotate(135);//旋轉(zhuǎn)135度,開(kāi)始畫(huà)線,總共畫(huà)270度。
QLine line(QPoint(outLineRadius,0),QPoint(innLineRadius,0));
for(int i = 1;i<=lineCount;i++){
if(i>value){
QPen pen;
pen.setColor(QColor("#D7D7D7"));
pen.setWidth(2);
painter->setPen(pen);
}
painter->drawLine(line);
painter->rotate(range);
}
painter->restore();
}
void CMPassrate2::drawBGE(QPainter* painter){
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QColor("#EAEAEA"));
QRect rect(-bgERadius,-bgERadius,bgERadius*2,bgERadius*2);
painter->drawEllipse(rect);
painter->restore();
}
void CMPassrate2::drawTextE(QPainter* painter){
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QColor("#2DC877"));
QPainterPath path;
QRect rectOut(-textOutRadius,-textOutRadius,textOutRadius*2,textOutRadius*2);
path.arcTo(rectOut,0,360);
QPainterPath subPath;
QRect rectInn(-textInnRadius,-textInnRadius,textInnRadius*2,textInnRadius*2);
subPath.addEllipse(rectInn);
path -= subPath;
painter->drawPath(path);
painter->restore();
}
void CMPassrate2::drawText(QPainter* painter){
painter->save();
painter->setPen(QColor("#62A0DB"));
QRect rectInn(-textInnRadius,-textInnRadius,textInnRadius*2,textInnRadius*2);
QFont font = painter->font();
font.setPixelSize(textSize);
painter->setFont(font);
painter->drawText(rectInn,Qt::AlignCenter,QString::number(value));
painter->restore();
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息
這篇文章主要介紹了C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
將CString字符串輸入轉(zhuǎn)化成整數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇將CString字符串輸入轉(zhuǎn)化成整數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)會(huì)員計(jì)費(fèi)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C語(yǔ)言斷言函數(shù)assert()的學(xué)習(xí)筆記
在C語(yǔ)言庫(kù)函數(shù)中提供了一個(gè)輔助調(diào)試程序的小型庫(kù),它是由assert()宏組成,本文就詳細(xì)的介紹了一下如何使用,感興趣的可以了解一下2021-11-11
詳解如何將Spire.XLS for C++集成到C++程序中
Spire.XLS for C++ 是一個(gè) Excel 庫(kù),供開(kāi)發(fā)人員在任何類(lèi)型的 C++ 應(yīng)用程序中操作 Excel 文檔(XLS、XLSX、XLSB 和 XLSM)。 本文演示了如何以?xún)煞N不同的方式將 Spire.XLS for C++ 集成到您的 C++ 應(yīng)用程序中2023-03-03

