QT控件大全 四十六 QSpeed

来源:互联网 发布:iso软件标准 编辑:程序博客网 时间:2024/06/05 11:18
描述:

QtWidgets are custom widgets for Qt Creator. 所有部件可在QtCreator设计器窗口推向世界。

效果如图:


核心代码:

#ifndef QGAUGE_H#define QGAUGE_H#include <Qt>#include <QWidget>#include <QLCDNumber>#include <QPropertyAnimation>class QColor;class QGauge : public QWidget{ Q_OBJECT    Q_ENUMS(errorCode);    Q_PROPERTY(double value READ value WRITE setValue);    Q_PROPERTY(double minValue READ minValue WRITE setMinValue);    Q_PROPERTY(double maxValue READ maxValue WRITE setMaxValue);    Q_PROPERTY(double threshold READ threshold WRITE setThreshold);    Q_PROPERTY(int precision READ precision WRITE setPrecision);    Q_PROPERTY(QString label READ label WRITE setLabel);    Q_PROPERTY(QString units READ units WRITE setUnits);    Q_PROPERTY(int steps READ steps WRITE setSteps);    Q_PROPERTY(int startAngle READ startAngle WRITE setStartAngle);    Q_PROPERTY(int endAngle READ endAngle WRITE setEndAngle);    Q_PROPERTY(QColor foreground READ foreground WRITE setForeground);    Q_PROPERTY(QColor background READ background WRITE setBackground);    Q_PROPERTY(bool enableThreshold READ thresholdEnabled WRITE setThresholdEnabled);    Q_PROPERTY(bool enableNumericIndicator READ enableNumericIndicator WRITE setNumericIndicatorEnabled);    Q_PROPERTY(bool circularBarEnabled READ circularBarEnabled WRITE setCircularBarEnabled);    Q_PROPERTY(bool coverGlassEnabled READ coverGlassEnabled WRITE setCoverGlassEnabled);    Q_PROPERTY(int digitCount READ digitCount WRITE setDigitCount)    Q_PROPERTY(int barSize READ barSize WRITE setBarSize)public:    enum ErrorCode {MaxValueError=1,MinValueError,ThresholdError,TargetError,PrecisionError,ColorError,UnitsEmpty,OutOfRange};    QGauge(QWidget *parent = 0);    ~QGauge();    double value() const { return m_value; }    double minValue() const { return m_minValue; }    double maxValue() const { return m_maxValue; }    double threshold() const { return m_threshold; }    int precision() const { return m_precision; }    QString label()const { return m_label; }    QString units()const { return m_units; }    int steps() const { return m_steps; }    int startAngle()  { return m_startAngle;}    int endAngle()  { return m_endAngle; }    QColor foreground() const { return m_foreground; }    QColor background() const { return m_background; }    bool thresholdEnabled() const { return m_thresholdEnabled; }    bool enableNumericIndicator() const { return m_numericIndicatorEnabled; }    bool circularBarEnabled() const {return m_circularBarEnabled; };    bool coverGlassEnabled() const {return m_coverGlassEnabled;};    int digitCount() const;    int barSize() const {return m_barSize;};signals:    void errorSignal(int);    void thresholdAlarm(bool);public slots:    void setValue(double);    void setValue(int);    void setMinValue(double);    void setMinValue(int);    void setMaxValue(double);    void setMaxValue(int);    void setThreshold(double);    void setThreshold(int);    void setPrecision(int);    void setLabel(QString);    void setUnits(QString);    void setSteps(int);    void setStartAngle(int);    void setEndAngle(int);    void setForeground(QColor);    void setBackground(QColor);    void setThresholdEnabled(bool);    void setNumericIndicatorEnabled(bool);    void setCircularBarEnabled(bool);    void setCoverGlassEnabled(bool);    void setDigitCount(int n_digits);    void setBarSize(int barSize);protected:        void paintEvent(QPaintEvent *event);        void resizeEvent(QResizeEvent *event);        void changeEvent(QEvent * event);private:    void thresholdManager();    int digits(int val);      void drawCrown(QPainter *painter);    void drawBackground(QPainter *painter);    void drawTicks(QPainter *painter);    void drawCircularBar(QPainter *painter);    void drawCoverGlass(QPainter *painter);    void drawLabel(QPainter *painter);    void drawUnits(QPainter *painter);    void drawThresholdLine(QPainter *painter);    double m_value;    double m_maxValue, m_minValue;    int m_precision;    QString m_label;    QString m_units;    int m_steps;    int m_barSize;    int m_startAngle,m_endAngle;    double m_threshold;    bool m_autodigits;    bool m_thresholdEnabled;    bool m_numericIndicatorEnabled;    bool m_circularBarEnabled;    bool m_coverGlassEnabled;    QColor m_foreground;    QColor m_background;    QLCDNumber* m_lcd;};#endif // QGAUGE_H

#include "qgauge.h"#include <QtGlobal>#include <QtGui>#include <QPainter>#include <QFont>QGauge::QGauge(QWidget *parent)    : QWidget(parent){   m_lcd = new QLCDNumber(this);   setPrecision(0);   setSteps(20);   setBarSize(5);   setMinimumSize(QSize(80,80));   setMaximumSize(QSize(1024,1024));   setStartAngle(225);   setEndAngle(-45);   setForeground(QColor(0, 166, 8));   setBackground(Qt::black);   setThresholdEnabled(false);   setNumericIndicatorEnabled(true);   int r,g,b;   r=foreground().red();   g=foreground().green();   b=foreground().blue();   QString style=QString("background-color: transparent; color: rgb(%1,%2,%3);").arg(r).arg(g).arg(b);   m_lcd->setStyleSheet(style);   m_lcd->setSegmentStyle(QLCDNumber::Flat);   m_autodigits=true;   setMinValue(0);   setMaxValue(100);   setDigitCount(5);   setValue(0);   setLabel("Speed");   setUnits("Km/h");   setThreshold(80);   setCircularBarEnabled(true);   setCoverGlassEnabled(true);   setEnabled(true);}QGauge::~QGauge(){    delete m_lcd;}int QGauge::digits(int val){    int digits = 0;       if (val <= 0) digits = 1; // remove this line if '-' counts as a digit       while (val) {           val /= 10;           digits++;       }       return digits;}void QGauge::setBarSize(int barSize){    m_barSize=barSize;    update();}void QGauge::setValue(double value){    if(!isEnabled())        return;    if(value>m_maxValue)    {        m_value=m_maxValue;        emit errorSignal(OutOfRange);    }    else        if(value<m_minValue)        {            m_value=m_minValue;            emit errorSignal(OutOfRange);        }        else        {            m_value=value;            if(m_autodigits)                m_lcd->setDigitCount(digits(value));            if(m_lcd)                m_lcd->display(m_value);        }    if(thresholdEnabled())    {        thresholdManager();        if(value>=threshold())        {            QString style=QString("background-color: transparent; color: rgb(200,0,0);");            m_lcd->setStyleSheet(style);        }        else        {            int r,g,b;            r=foreground().red();            g=foreground().green();            b=foreground().blue();            QString style=QString("background-color: transparent; color: rgb(%1,%2,%3);").arg(r).arg(g).arg(b);            m_lcd->setStyleSheet(style);        }    }    else    {        int r,g,b;        r=foreground().red();        g=foreground().green();        b=foreground().blue();        QString style=QString("background-color: transparent; color: rgb(%1,%2,%3);").arg(r).arg(g).arg(b);        m_lcd->setStyleSheet(style);    }    update();}int QGauge::digitCount() const{    if(m_autodigits)        return -1;    if(m_lcd)        return m_lcd->digitCount();    else        return 0;}void QGauge::setValue(int value){   setValue((double)value);   update();}void QGauge::setMinValue(double value){   m_minValue=value;   update();}void QGauge::setMinValue(int value){  setMinValue((double)value);}void QGauge::setMaxValue(double value){    if(value > m_minValue)    {        m_maxValue=value;        update();    }    else        emit errorSignal(MaxValueError);}void QGauge::setMaxValue(int value){  setMaxValue((double)value);}void QGauge::setThreshold(double value){    if(value > m_minValue && value < m_maxValue)    {        m_threshold=value;        m_thresholdEnabled=true;        update();    }    else        emit errorSignal(ThresholdError);}void QGauge::setThreshold(int value){  setThreshold((double)value);}void QGauge::setPrecision(int precision){   m_precision=precision;   update();}void QGauge::setLabel(QString label){    m_label=label;    update();}void QGauge::setUnits(QString units){    m_units=units;    update();}void QGauge::setDigitCount(int n_digits){    if(n_digits>0)    {        if (m_lcd)            m_lcd->setDigitCount(n_digits);    }    else            m_autodigits=true;    }void QGauge::resizeEvent(QResizeEvent *event){    Q_UNUSED(event);    int side = qMin(width(), height());    m_lcd->setGeometry(width()/2-side/4,height()/2-side/6,side/2,side/3);    update();}void QGauge::changeEvent(QEvent *event){    if(!isEnabled())    {        QString style=QString("background-color: transparent; color: rgb(200,200,200);");        m_lcd->setStyleSheet(style);        update();    }    else        setValue(value());}void QGauge::paintEvent(QPaintEvent *event){    Q_UNUSED(event);    QPainter painter(this);    painter.setRenderHint(QPainter::Antialiasing, true);    int side = qMin(width(), height());    painter.setViewport((width() - side) / 2, (height() - side) / 2,side, side);    painter.setWindow(-50, -50, 100, 100);    drawBackground(&painter);    if(circularBarEnabled())        drawCircularBar(&painter);    drawTicks(&painter);    if(coverGlassEnabled())        drawCoverGlass(&painter);    drawLabel(&painter);    drawUnits(&painter);    drawCrown(&painter);    if(thresholdEnabled())        drawThresholdLine(&painter);}void QGauge::setCoverGlassEnabled(bool enable){    m_coverGlassEnabled=enable;    update();}void QGauge::setSteps(int nSteps){    if(nSteps>1)    {        m_steps=nSteps;        update();    }    else        nSteps=1;}void QGauge::setStartAngle(int value){    m_startAngle=value;    update();}void QGauge::setEndAngle(int value){    m_endAngle=value;    update();}void QGauge::setForeground(QColor newForeColor){    m_foreground=newForeColor;    int r,g,b;    r=foreground().red();    g=foreground().green();    b=foreground().blue();    QString style=QString("background-color: transparent; color: rgb(%1,%2,%3);").arg(r).arg(g).arg(b);    m_lcd->setStyleSheet(style);    update();}void QGauge::setBackground(QColor newBackColor){    m_background=newBackColor;    int r,g,b;    r=foreground().red();    g=foreground().green();    b=foreground().blue();    QString style=QString("background-color: transparent; color: rgb(%1,%2,%3);").arg(r).arg(g).arg(b);    m_lcd->setStyleSheet(style);    update();}void QGauge::thresholdManager(){    if(m_value > m_threshold)     emit thresholdAlarm(true);    else     if(m_value < m_threshold)      emit thresholdAlarm(false);}void QGauge::setThresholdEnabled(bool enable){  m_thresholdEnabled=enable;  update();}void QGauge::setNumericIndicatorEnabled(bool enable){  m_numericIndicatorEnabled=enable;  m_lcd->setVisible(enable);  update();}void QGauge::setCircularBarEnabled(bool enable){    m_circularBarEnabled=enable;    update();}

源码工程:QQ:609162385



原创粉丝点击