196 lines
6.6 KiB
C
196 lines
6.6 KiB
C
|
#pragma once
|
|||
|
|
|||
|
#include <QWidget>
|
|||
|
|
|||
|
class QRoundProgressBar : public QWidget
|
|||
|
{
|
|||
|
Q_OBJECT
|
|||
|
|
|||
|
public:
|
|||
|
explicit QRoundProgressBar(QWidget *parent = 0);
|
|||
|
|
|||
|
static const int PositionLeft = 180;
|
|||
|
static const int PositionTop = 90;
|
|||
|
static const int PositionRight = 0;
|
|||
|
static const int PositionBottom = -90;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Return position (in degrees) of minimum value.
|
|||
|
* \sa setNullPosition
|
|||
|
*/
|
|||
|
double nullPosition() const { return m_nullPosition; }
|
|||
|
/**
|
|||
|
* @brief Defines position of minimum value.
|
|||
|
* @param position position on the circle (in degrees) of minimum value
|
|||
|
* \sa nullPosition
|
|||
|
*/
|
|||
|
void setNullPosition(double position);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief The BarStyle enum defines general look of the progress bar.
|
|||
|
*/
|
|||
|
enum BarStyle
|
|||
|
{
|
|||
|
/// Donut style (filled torus around the text)
|
|||
|
StyleDonut,
|
|||
|
/// Pie style (filled pie segment with the text in center)
|
|||
|
StylePie,
|
|||
|
/// Line style (thin round line around the text)
|
|||
|
StyleLine
|
|||
|
};
|
|||
|
/**
|
|||
|
* @brief Sets visual style of the widget.
|
|||
|
* \sa barStyle
|
|||
|
*/
|
|||
|
void setBarStyle(BarStyle style);
|
|||
|
/**
|
|||
|
* @brief Returns current progree bar style.
|
|||
|
* \sa setBarStyle
|
|||
|
*/
|
|||
|
BarStyle barStyle() const { return m_barStyle; }
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Sets width of the outline circle pen.
|
|||
|
* @param penWidth width of the outline circle pen (in pixels)
|
|||
|
*/
|
|||
|
void setOutlinePenWidth(double penWidth);
|
|||
|
/**
|
|||
|
* @brief Returns width of the outline circle pen.
|
|||
|
*/
|
|||
|
double outlinePenWidth() const { return m_outlinePenWidth; }
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Sets width of the data circle pen.
|
|||
|
* @param penWidth width of the data circle pen (in pixels)
|
|||
|
*/
|
|||
|
void setDataPenWidth(double penWidth);
|
|||
|
/**
|
|||
|
* @brief Returns width of the data circle pen.
|
|||
|
*/
|
|||
|
double dataPenWidth() const { return m_dataPenWidth; }
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Sets colors of the visible data and makes gradient brush from them.
|
|||
|
* Gradient colors can be set for \a Donut and \a Pie styles (see setBarStyle() function).
|
|||
|
*
|
|||
|
* *Warning*: this function will override widget's `palette()` to set dynamically created gradient brush.
|
|||
|
*
|
|||
|
* @param stopPoints List of colors (should have at least 2 values, see Qt's \a QGradientStops for more details).
|
|||
|
* Color value at point 0 corresponds to the minimum() value, while color value at point 1
|
|||
|
* corresponds to the maximum(). Other colors will be distributed accordingly to the defined ranges (see setRange()).
|
|||
|
*/
|
|||
|
void setDataColors(const QGradientStops& stopPoints);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Defines the string used to generate the current text.
|
|||
|
* If no format is set, no text will be shown.
|
|||
|
* @param format see \a QProgressBar's format description
|
|||
|
* \sa setDecimals
|
|||
|
*/
|
|||
|
void setFormat(const QString& format);
|
|||
|
/**
|
|||
|
* @brief Sets format string to empty string. No text will be shown therefore.
|
|||
|
* See setFormat() for more information.
|
|||
|
*/
|
|||
|
void resetFormat();
|
|||
|
/**
|
|||
|
* @brief Returns the string used to generate the current text.
|
|||
|
*/
|
|||
|
QString format() const { return m_format; }
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Sets number of decimals to show after the comma (default is 1).
|
|||
|
* \sa setFormat
|
|||
|
*/
|
|||
|
void setDecimals(int count);
|
|||
|
/**
|
|||
|
* @brief Returns number of decimals to show after the comma (default is 1).
|
|||
|
* \sa setFormat, setDecimals
|
|||
|
*/
|
|||
|
int decimals() const { return m_decimals; }
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Returns current value shown on the widget.
|
|||
|
* \sa setValue()
|
|||
|
*/
|
|||
|
double value() const { return m_value; }
|
|||
|
/**
|
|||
|
* @brief Returns minimum of the allowed value range.
|
|||
|
* \sa setMinimum, setRange
|
|||
|
*/
|
|||
|
double minimum() const { return m_min; }
|
|||
|
/**
|
|||
|
* @brief Returns maximum of the allowed value range.
|
|||
|
* \sa setMaximum, setRange
|
|||
|
*/
|
|||
|
double maximum() const { return m_max; }
|
|||
|
|
|||
|
float innerOuterRate() const;
|
|||
|
void setInnerOuterRate(float innerOuterRate);
|
|||
|
|
|||
|
public Q_SLOTS:
|
|||
|
/**
|
|||
|
* @brief Defines minimum und maximum of the allowed value range.
|
|||
|
* If the current value does not fit into the range, it will be automatically adjusted.
|
|||
|
* @param min minimum of the allowed value range
|
|||
|
* @param max maximum of the allowed value range
|
|||
|
*/
|
|||
|
void setRange(double min, double max);
|
|||
|
/**
|
|||
|
* @brief Defines minimum of the allowed value range.
|
|||
|
* If the current value does not fit into the range, it will be automatically adjusted.
|
|||
|
* @param min minimum of the allowed value range
|
|||
|
* \sa setRange
|
|||
|
*/
|
|||
|
void setMinimum(double min);
|
|||
|
/**
|
|||
|
* @brief Defines maximum of the allowed value range.
|
|||
|
* If the current value does not fit into the range, it will be automatically adjusted.
|
|||
|
* @param max maximum of the allowed value range
|
|||
|
* \sa setRange
|
|||
|
*/
|
|||
|
void setMaximum(double max);
|
|||
|
/**
|
|||
|
* @brief Sets a value which will be shown on the widget.
|
|||
|
* @param val must be between minimum() and maximum()
|
|||
|
*/
|
|||
|
void setValue(double val);
|
|||
|
/**
|
|||
|
* @brief Integer version of the previous slot.
|
|||
|
* @param val must be between minimum() and maximum()
|
|||
|
*/
|
|||
|
void setValue(int val);
|
|||
|
|
|||
|
protected:
|
|||
|
virtual void paintEvent(QPaintEvent *event);
|
|||
|
virtual void drawBackground(QPainter& p, const QRectF& baseRect);
|
|||
|
virtual void drawBase(QPainter& p, const QRectF& baseRect, const QRectF &innerRect);
|
|||
|
virtual void drawValue(QPainter& p, const QRectF& baseRect, double value, double arcLength, const QRectF & innerRect
|
|||
|
, double innerRadius);
|
|||
|
virtual void calculateInnerRect(const QRectF& baseRect, double outerRadius, QRectF& innerRect, double& innerRadius);
|
|||
|
virtual void drawInnerBackground(QPainter& p, const QRectF& innerRect);
|
|||
|
virtual void drawText(QPainter& p, const QRectF& innerRect, double innerRadius, double value);
|
|||
|
virtual QString valueToText(double value) const;
|
|||
|
virtual void valueFormatChanged();
|
|||
|
virtual QSize minimumSizeHint() const { return QSize(32,32); }
|
|||
|
virtual bool hasHeightForWidth() const { return true; }
|
|||
|
virtual int heightForWidth(int w) const { return w; }
|
|||
|
|
|||
|
void rebuildDataBrushIfNeeded();
|
|||
|
|
|||
|
double m_min, m_max;
|
|||
|
double m_value;
|
|||
|
float m_innerOuterRate;///< 内径比外径,这里m_innerOuterRate应该小于1
|
|||
|
double m_nullPosition;
|
|||
|
BarStyle m_barStyle;
|
|||
|
double m_outlinePenWidth, m_dataPenWidth;
|
|||
|
QGradientStops m_gradientData;
|
|||
|
bool m_rebuildBrush;
|
|||
|
QString m_format;
|
|||
|
int m_decimals;
|
|||
|
static const int UF_VALUE = 1;
|
|||
|
static const int UF_PERCENT = 2;
|
|||
|
static const int UF_MAX = 4;
|
|||
|
int m_updateFlags;
|
|||
|
};
|