#include "qcwthermometer.h" #include <QPainter> QcwThermometer::QcwThermometer(QWidget *parent): QWidget(parent) { m_value = 0; m_minValue = -30; m_maxValue = 70; m_thresholdUp = -20; m_thresholdDown = 50; m_thresholdFlag = false; m_units = QString::fromUtf8("%1°C", -1).arg(m_value); m_scaleMajor = 10; m_scaleMinor = 5; m_borderColor = "#00BCD4"; m_foreground = "#00BCD4"; m_background = Qt::white; m_liquidColor = Qt::red; resize(50, 125); } void QcwThermometer::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */ painter.translate(width() / 2, height() / 2); /* 坐标变换为窗体中心 */ int side = qMin(width(), height()); painter.scale(side / 200.0, side / 200.0); /* 比例缩放 */ painter.setPen(Qt::NoPen); int nSteps = m_scaleMajor * m_scaleMinor; double step = 400.0 / nSteps; QFont font = this->font(); /* 绘制边框 */ painter.save(); painter.setPen(QPen(m_borderColor, 4)); painter.drawRect(-95, -245, 190, 490); painter.restore(); /* 绘制背景 */ painter.save(); painter.setBrush(m_background); painter.drawRect(-90, -240, 180, 480); painter.restore(); /* 绘制液体容器圆 */ painter.save(); painter.setBrush(m_foreground); painter.drawEllipse(-50, 230, 40, -40); painter.restore(); /* 绘制液体容器柱 */ painter.save(); painter.setBrush(m_foreground); painter.drawRect(-40, 210, 20, -440); painter.restore(); /* 绘制单位 */ painter.save(); painter.setPen(m_foreground); font.setPointSize(18); painter.setFont(font); m_units = QString::fromUtf8("%1°C", -1).arg(m_value); //显示具体温度 painter.drawText(15, 220, m_units); painter.restore(); /* 绘制刻度线 */ painter.save(); QPen pen(m_foreground); for (int i = 0, y = 180.0; i <= nSteps; i++, y -= step) { if (i % m_scaleMinor == 0) { pen.setWidth(2); painter.setPen(pen); painter.drawLine(-20, y, 0, y); } else { pen.setWidth(1); painter.setPen(pen); painter.drawLine(-20, y, -10, y); } } painter.restore(); /* 绘制刻度值 */ painter.save(); painter.setPen(m_foreground); double tmpVal; step = 400.0 / m_scaleMajor; for (int i = 0, y = 185.0; i <= m_scaleMajor; i++, y -= step) { tmpVal = 1.0 * i * ((m_maxValue - m_minValue) / m_scaleMajor) + m_minValue; painter.drawText(5, y, QString( "%1" ).arg(tmpVal)); } painter.restore(); /* 绘制液体圆 */ painter.save(); painter.setBrush(m_liquidColor); painter.drawEllipse(-45, 225, 30, -30); painter.restore(); /* 绘制液体柱(指示) */ painter.save(); painter.setBrush(m_liquidColor); double val = 400.0 / (m_maxValue - m_minValue) * (m_value - m_minValue); painter.drawRect(-35, 205, 10, -val - 25); painter.restore(); } void QcwThermometer::setValue(double val) { if (val > m_maxValue) { m_value = m_maxValue; } else if (val < m_minValue) { m_value = m_minValue; } else { m_value = val; } thresholdManager(); update(); } void QcwThermometer::setMinValue(int val) { m_minValue = val; update(); } void QcwThermometer::setMaxValue(int val) { m_maxValue = val; update(); } void QcwThermometer::setThresholdUp(double val) { m_thresholdUp = val; thresholdManager(); update(); } void QcwThermometer::setThresholdDown(double val) { m_thresholdDown = val; thresholdManager(); update(); } void QcwThermometer::setUnits(QString str) { m_units = str; update(); } void QcwThermometer::setScaleMajor(int scale) { m_scaleMajor = scale; update(); } void QcwThermometer::setScaleMinor(int scale) { m_scaleMinor = scale; update(); } void QcwThermometer::setBorderColor(QColor color) { m_borderColor = color; update(); } void QcwThermometer::setForeground(QColor color) { m_foreground = color; update(); } void QcwThermometer::setBackground(QColor color) { m_background = color; update(); } void QcwThermometer::setLiquidColor(QColor color) { m_liquidColor = color; update(); } void QcwThermometer::thresholdManager() { if (!m_thresholdFlag) { if(m_value > m_thresholdUp) { m_thresholdFlag = true; Q_EMIT thresholdAlarm(AlarmUp); } else if(m_value < m_thresholdDown) { m_thresholdFlag = true; Q_EMIT thresholdAlarm(AlarmDown); } } else if (m_value <= m_thresholdUp && m_value >= m_thresholdDown) { m_thresholdFlag = false; Q_EMIT thresholdAlarm(AlarmNo); } }