您好,登錄后才能下訂單哦!
本篇文章為大家展示了使用Qt怎么實現進度條,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
有時我們需要在表格(QTableWidget)、樹狀欄(QTreeWidget)中直觀顯示任務進度或消耗百分比,達到報表顯示的形式,可通過重寫QLabel的方式實現。
1、進度條控件功能
1)可設置值動態變化
2)可設置警戒值
3)可設置正常顏色和報警顏色
4)可設置邊框漸變顏色
5)可設置變化時每次移動的步長
6)可設置錯誤時顯示錯誤描述
7)可設置顯示值保留小數的位數
8)可設置邊框圓角角度/背景進度圓角角度/頭部圓角角度
2、實現效果
1、運行環境Qt5.5 VS2013
2、繼承QLabel重寫ProgressLabel控件
/*********************************************************************** 作者:liangtianmanyue(QQ:1660941209) 2021-05-30 功能:進度控件 1、可設置值動態變化 2、可設置警戒值 3、可設置正常顏色和報警顏色 4、可設置邊框漸變顏色 5、可設置變化時每次移動的步長 6、可設置錯誤時顯示錯誤描述 7、可設置顯示值保留小數的位數 8、可設置邊框圓角角度/背景進度圓角角度/頭部圓角角度 ************************************************************************/ #ifndef PROGRESS_LABEL_H #define PROGRESS_LABEL_H #include <QLabel> #include <QWidget> #ifdef Plugin #if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) #include <QtDesigner/QDesignerExportWidget> #else #include <QtUiPlugin/QDesignerExportWidget> #endif class QDESIGNER_WIDGET_EXPORT ProgressLabel : public QLabel #else class ProgressLabel : public QLabel #endif { Q_OBJECT Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue) Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue) Q_PROPERTY(double value READ getValue WRITE setValue) Q_PROPERTY(double alarmValue READ getAlarmValue WRITE setAlarmValue) Q_PROPERTY(double step READ getStep WRITE setStep) Q_PROPERTY(int decimals READ getDecimals WRITE setDecimals) Q_PROPERTY(int borderRadius READ getBorderRadius WRITE setBorderRadius) Q_PROPERTY(int bgRadius READ getBgRadius WRITE setBgRadius) Q_PROPERTY(int headRadius READ getHeadRadius WRITE setHeadRadius) Q_PROPERTY(QColor borderColorStart READ getBorderColorStart WRITE setBorderColorStart) Q_PROPERTY(QColor borderColorEnd READ getBorderColorEnd WRITE setBorderColorEnd) Q_PROPERTY(QColor alarmColorStart READ getAlarmColorStart WRITE setAlarmColorStart) Q_PROPERTY(QColor alarmColorEnd READ getAlarmColorEnd WRITE setAlarmColorEnd) Q_PROPERTY(QColor normalColorStart READ getNormalColorStart WRITE setNormalColorStart) Q_PROPERTY(QColor normalColorEnd READ getNormalColorEnd WRITE setNormalColorEnd) public: explicit ProgressLabel(QWidget *parent = 0); ~ProgressLabel(); protected: void paintEvent(QPaintEvent *); void drawBg(QPainter *painter); private slots: void updateValue(); public: double getMinValue() const; double getMaxValue() const; double getValue() const; double getAlarmValue() const; double getStep() const; int getBorderRadius() const; int getBgRadius() const; int getHeadRadius() const; QColor getBorderColorStart() const; QColor getBorderColorEnd() const; QColor getAlarmColorStart() const; QColor getAlarmColorEnd() const; QColor getNormalColorStart() const; QColor getNormalColorEnd() const; QSize sizeHint() const; QSize minimumSizeHint() const; public Q_SLOTS: //設置范圍值 void setRange(double minValue, double maxValue); void setRange(int minValue, int maxValue); //設置最大最小值 void setMinValue(double minValue); void setMaxValue(double maxValue); //設置顯示值 void setValue(double value); void setValue(int value); //設置警戒值 void setAlarmValue(double alarmValue); void setAlarmValue(int alarmValue); //設置步長 void setStep(double step); void setStep(int step); //小數點位數 int getDecimals(); void setDecimals(int decimals); //設置邊框圓角角度 void setBorderRadius(int borderRadius); //設置背景圓角角度 void setBgRadius(int bgRadius); //設置頭部圓角角度 void setHeadRadius(int headRadius); //設置邊框漸變顏色 void setBorderColorStart(const QColor &borderColorStart); void setBorderColorEnd(const QColor &borderColorEnd); //設置報警時的漸變顏色 void setAlarmColorStart(const QColor &alarmColorStart); void setAlarmColorEnd(const QColor &alarmColorEnd); //設置正常時的漸變顏色 void setNormalColorStart(const QColor &normalColorStart); void setNormalColorEnd(const QColor &normalColorEnd); //正常、異常顯示 void setNormalState(); void setErrorText(const QString &text); Q_SIGNALS: void valueChanged(double value); private: bool m_IsError; //是否出錯 QString m_ErrorText; //錯誤描述 double minValue; //最小值 double maxValue; //最大值 double value; //目標電量 double alarmValue; //警戒值 int decimals; //顯示小數點后位數 double step; //每次移動的步長 int borderRadius; //邊框圓角角度 int bgRadius; //背景進度圓角角度 int headRadius; //頭部圓角角度 QColor borderColorStart; //邊框漸變開始顏色 QColor borderColorEnd; //邊框漸變結束顏色 QColor alarmColorStart; //超警戒值時的漸變開始顏色 QColor alarmColorEnd; //超警戒值時的漸變結束顏色 QColor normalColorStart; //正常時的漸變開始顏色 QColor normalColorEnd; //正常時的漸變結束顏色 bool isForward; //是否往前移 double currentValue; //當前值 QRectF mainRect; //主體區域 QTimer *timer; //繪制定時器 }; #endif // PROGRESS_LABEL_H
3、重寫paintEvent事件,根據是否有出錯,繪制出錯信息或值
void ProgressLabel::paintEvent(QPaintEvent *) { //繪制準備工作,啟用反鋸齒 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //獲取邊框區域 QPointF topLeft(2, 2); QPointF bottomRight(width() - 4, height() - 2); mainRect = QRectF(topLeft, bottomRight); //繪制背景 drawBg(&painter); } void ProgressLabel::drawBg(QPainter *painter) { if(!m_IsError) { painter->save(); QLinearGradient gradient(QPointF(0, 0), QPointF(0, height())); if (currentValue >= alarmValue) { gradient.setColorAt(0.0, alarmColorStart); gradient.setColorAt(1.0, alarmColorEnd); } else { gradient.setColorAt(0.0, normalColorStart); gradient.setColorAt(1.0, normalColorEnd); } double min = qMin(width(), height()); int margin = min / 20; double unit = (mainRect.width() - (margin * 2)) / 100; double width = currentValue * unit; QPointF topLeft(mainRect.topLeft().x() + margin, mainRect.topLeft().y() + margin); QPointF bottomRight(width + margin + , mainRect.bottomRight().y() - margin); QRectF rect(topLeft, bottomRight); painter->setPen(Qt::NoPen); painter->setBrush(gradient); painter->drawRoundedRect(rect, bgRadius, bgRadius); painter->restore(); } //寫進度 painter->save(); QPen pen(Qt::SolidLine); pen.setWidth(1); if(m_IsError) pen.setColor(Qt::red); else pen.setColor(Qt::black); painter->setPen(pen); painter->setBrush(Qt::NoBrush); if(m_IsError) painter->drawText(mainRect, Qt::AlignCenter, m_ErrorText); else painter->drawText(mainRect, Qt::AlignCenter, QString("%1%").arg(currentValue, 0, 'f', decimals)); painter->restore(); }
4、刷新值時采用定時器定時刷新方式,達到動態效果
創建定時器
timer = new QTimer(this); timer->setInterval(10); connect(timer, SIGNAL(timeout()), this, SLOT(updateValue()));
按step值刷新
void ProgressLabel::updateValue() { if (isForward) { currentValue -= step; if (currentValue <= value) { timer->stop(); currentValue = value;//保持真實性 } } else { currentValue += step; if (currentValue >= value) { timer->stop(); currentValue = value;//保持真實性 } } this->update(); }
5、外部設置值的時候,清除錯誤標志,并啟動定時器
void ProgressLabel::setValue(double value) { m_IsError = false; //值和當前值一致則無需處理 if (value == this->value) return; //值小于最小值則取最小值,大于最大值則取最大值 if (value < minValue) value = minValue; else if (value > maxValue) value = maxValue; if (value > currentValue) isForward = false; else if (value < currentValue) isForward = true; else return; this->value = value; this->update(); emit valueChanged(value); timer->start(); }
上述內容就是使用Qt怎么實現進度條,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。