導航進度條控件,其實就是支付寶、京東、淘寶訂單頁面的進度控件,提示當前第幾步,總共有幾步,而後當前進度特殊顏色顯示,每一個進度帶有時間文字等信息,本控件特地將三種樣式風格都集成進去了,京東訂單流程樣式/淘寶訂單流程樣式/支付寶訂單流程樣式,能夠動態切換樣式,控件自適應任何分辨率,能夠自由調整自身大小以適應分辨率的改變,總步驟以及當前步驟都是自動計算佔用區域比例,直接提供接口設置步驟對應的文字信息等,接口很是友好。linux
#ifndef NAVPROGRESS_H #define NAVPROGRESS_H /** * 導航進度條控件 做者:feiyangqingyun(QQ:517216493) 2016-11-29 * 1:可設置前景色/背景色/當前值前景色/當前值背景色 * 2:可設置最大步數及當前第幾步 * 3:可設置導航標籤隊列文字信息 * 4:可設置三種風格樣式 京東訂單流程樣式/淘寶訂單流程樣式/支付寶訂單流程樣式 * 5:文字自適應大小 */ #include <QWidget> #ifdef quc #if (QT_VERSION < QT_VERSION_CHECK(5,7,0)) #include <QtDesigner/QDesignerExportWidget> #else #include <QtUiPlugin/QDesignerExportWidget> #endif class QDESIGNER_WIDGET_EXPORT NavProgress : public QWidget #else class NavProgress : public QWidget #endif { Q_OBJECT Q_ENUMS(NavStyle) Q_PROPERTY(int maxStep READ getMaxStep WRITE setMaxStep) Q_PROPERTY(int currentStep READ getCurrentStep WRITE setCurrentStep) Q_PROPERTY(NavStyle navStyle READ getNavStyle WRITE setNavStyle) Q_PROPERTY(QColor background READ getBackground WRITE setBackground) Q_PROPERTY(QColor foreground READ getForeground WRITE setForeground) Q_PROPERTY(QColor currentBackground READ getCurrentBackground WRITE setCurrentBackground) Q_PROPERTY(QColor currentForeground READ getCurrentForeground WRITE setCurrentForeground) public: enum NavStyle { NavStyle_JD = 0, //京東訂單流程樣式 NavStyle_TB = 1, //淘寶訂單流程樣式 NavStyle_ZFB = 2 //支付寶訂單流程樣式 }; explicit NavProgress(QWidget *parent = 0); protected: void paintEvent(QPaintEvent *); void drawBg_JD(QPainter *painter); void drawText_JD(QPainter *painter); void drawCurrentBg_JD(QPainter *painter); void drawCurrentText_JD(QPainter *painter); void drawBg_TB(QPainter *painter); void drawText_TB(QPainter *painter); void drawCurrentBg_TB(QPainter *painter); void drawBg_ZFB(QPainter *painter); void drawText_ZFB(QPainter *painter); void drawCurrentBg_ZFB(QPainter *painter); private: QStringList topInfo; //導航頂部標籤數據 QStringList bottomInfo; //導航底部標籤數據 int maxStep; //最大步數 int currentStep; //當前第幾步 NavStyle navStyle; //導航樣式 QColor background; //背景色 QColor foreground; //前景色 QColor currentBackground; //當前背景色 QColor currentForeground; //當前前景色 QFont iconFont; //圖形字體 public: QStringList getTopInfo() const; QStringList getBottomInfo() const; int getMaxStep() const; int getCurrentStep() const; NavStyle getNavStyle() const; QColor getBackground() const; QColor getForeground() const; QColor getCurrentBackground() const; QColor getCurrentForeground() const; QSize sizeHint() const; QSize minimumSizeHint() const; public Q_SLOTS: //設置導航頂部標籤數據 void setTopInfo(const QStringList &topInfo); //設置導航底部標籤數據 void setBottomInfo(const QStringList &bottomInfo); //設置最大步數 void setMaxStep(int maxStep); //設置當前第幾步 void setCurrentStep(int currentStep); //設置導航樣式 void setNavStyle(const NavStyle &navStyle); //設置前景色 void setBackground(const QColor &background); //設置前景色 void setForeground(const QColor &foreground); //設置當前前景色 void setCurrentBackground(const QColor ¤tBackground); //設置當前前景色 void setCurrentForeground(const QColor ¤tForeground); }; #endif // NAVPROGRESS_H
void NavProgress::paintEvent(QPaintEvent *) { //繪製準備工做,啓用反鋸齒 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //根據不同的樣式繪製 if (navStyle == NavStyle_JD) { //繪製背景 drawBg_JD(&painter); //繪製文字 drawText_JD(&painter); //繪製當前背景 drawCurrentBg_JD(&painter); //繪製當前文字 drawCurrentText_JD(&painter); } else if (navStyle == NavStyle_TB) { //繪製背景 drawBg_TB(&painter); //繪製文字 drawText_TB(&painter); //繪製當前背景 drawCurrentBg_TB(&painter); } else if (navStyle == NavStyle_ZFB) { //繪製背景 drawBg_ZFB(&painter); //繪製文字 drawText_ZFB(&painter); //繪製當前背景 drawCurrentBg_ZFB(&painter); } } void NavProgress::drawBg_JD(QPainter *painter) { painter->save(); //圓半徑爲高度必定比例,計算寬度,將寬度等分 int width = this->width() / maxStep; int height = this->height() / 2; int radius = height / 2; int initX = 0; int initY = height / 2 + radius / 5; //逐個繪製鏈接線條 initX = width / 2; QPen pen; pen.setWidthF((double)radius / 4); pen.setCapStyle(Qt::RoundCap); pen.setColor(background); painter->setPen(pen); painter->setBrush(Qt::NoBrush); for (int i = 0; i < maxStep - 1; i++) { painter->drawLine(QPoint(initX, initY), QPoint(initX + width, initY)); initX += width; } //逐個繪製圓 initX = width / 2; painter->setPen(Qt::NoPen); painter->setBrush(background); for (int i = 0; i < maxStep; i++) { painter->drawEllipse(QPoint(initX, initY), radius, radius); initX += width; } //逐個繪製圓中的數字 initX = width / 2; QFont font; font.setPixelSize(radius); painter->setFont(font); painter->setPen(foreground); painter->setBrush(Qt::NoBrush); for (int i = 0; i < maxStep; i++) { QRect textRect(initX - radius, initY - radius, radius * 2, radius * 2); painter->drawText(textRect, Qt::AlignCenter, QString::number(i + 1)); initX += width; } painter->restore(); } void NavProgress::drawText_JD(QPainter *painter) { int width = this->width() / maxStep; int height = this->height() / 2; int initX = 0; int initY = height; painter->save(); QFont font; font.setPixelSize(height / 3); painter->setFont(font); painter->setPen(background); painter->setBrush(Qt::NoBrush); for (int i = 0; i < maxStep; i++) { QRect textRect(initX, initY, width, height); painter->drawText(textRect, Qt::AlignCenter, topInfo.at(i)); initX += width; } painter->restore(); }