在Qt的开发过程中,有些复杂的界面展示需要自动绘制,比如仪表盘的数据变化,都是动态的,而显示的效果只能通过paintEvent事件来自绘,本篇介绍仪表盘的绘制。
绘制分为4个部分
1.绘制背景
void DrawDashboard::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//绘制背景
painter.setPen(Qt::NoPen);
painter.fillRect(this->rect(), Qt::gray);
painter.drawPixmap(0, 0, m_pixmap);
}
2.绘制圆弧
void DrawDashboard::drawArc(QPainter &painter)
{
m_temperature = (m_temperature > 54) ? 54 : m_temperature;
m_temperature = (m_temperature < -18) ? -18 : m_temperature;
QColor color;
if(m_temperature <= 0 || m_temperature >= 35)
color = QColor("#FF0000");
else if(m_temperature > 3 && m_temperature < 32)
color = QColor("#28C840");
else
color = QColor("#FBC320");
QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
QRect rectangle(11, 11, 278, 278);//px, px, w, h
//度数对应数学的象限度数
int startAngle = 0 * 16;
int spanAngle = 270 * 16;
//绘制圆弧: 绘制由给定矩形 startAngle 和 spanAngle 定义的圆弧。startAngle 和 spanAngle 必须以 1/16 度为单位指定,
// 即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度位于 3 点钟位置。
//矩形区域 起始角度 偏转角度
//painter.drawArc(rectangle, startAngle, spanAngle);
int startPos = 180 * 16; //9点钟位置
if(m_temperature > 0)
{
//正数
//float endPos = -5.4 * 16 * m_temperature; //顺时针旋转270度 270.0 / 50 = 5.4
float endPos = -5 * 16 * m_temperature; //顺时针旋转270度 270.0 / 54 = 5
painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
}
else
{
//负数
//float endPos = -9 * 16 * m_temperature; //顺时针旋转90度 90 / 10 = 9
float endPos = -5 * 16 * m_temperature; //顺时针旋转90度 90 / 18 = 5
painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
}
}
3、绘制刻度
void DrawDashboard::drawScale(QPainter &painter, int radius)
{
int w = width();
int h = height();
//int radius = qMin(w, h) / 2;
QPoint center(w / 2, h / 2);
//painter.setPen(QPen(Qt::black, radius * 0.05));
painter.setPen(QPen(QColor("#DDDDDD"), 1));
painter.setBrush(QBrush(QColor("#FFFFFF")));
QRectF rectangle(0, 0, 24, 4);
std::vector<int> vecVal{0, 3, 35};//0刻度 3刻度 35刻度
for (size_t i = 0; i < vecVal.size(); ++i) {
float flo = vecVal[i];
int val = vecVal[i];
if(val == 0 && m_temperature < 0)
flo = 6.5;
else
flo = val + 6;
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-30 + flo * 5.0);
painter.drawRoundedRect(rectangle, 2, 2);
painter.restore();
}
}
4、绘制刻度值
void DrawDashboard::drawScaleValue(QPainter &painter, int radius)
{
//设置画笔,画笔默认NoPen
painter.setPen(QColor(153, 153, 153)); //#999999
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(12);
painter.setFont(font);
std::vector<int> vecVal{0, 3, 35};//0刻度 3刻度 35刻度
for (size_t i = 0; i < vecVal.size(); ++i) {
float flo = vecVal[i];
int val = vecVal[i];
if(val == 0 && m_temperature < 0)
flo = 6.5;
else
flo = val + 6;
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-120 + flo * 5.0);
painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(vecVal[i]));
painter.restore();
}
//还原画笔
painter.setPen(Qt::NoPen);
}
5、绘制文字
void DrawDashboard::drawTemperature(QPainter &painter, int width)
{
painter.save();
m_temperature = (m_temperature > 54) ? 54 : m_temperature;
m_temperature = (m_temperature < -18) ? -18 : m_temperature;
QColor color;
if(m_temperature <= 0 || m_temperature >= 35)
color = QColor("#FF0000");
else if(m_temperature > 3 && m_temperature < 32)
color = QColor("#28C840");
else
color = QColor("#FBC320");
painter.setPen(color);
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(14);
painter.setFont(font);
QString strText = QString("正常水温");
painter.drawText(20, 70, width - 40, 16, Qt::AlignCenter, strText);
font.setPixelSize(12);
painter.setFont(font);
painter.drawText(220, 102, 14, 14, Qt::AlignCenter, QString("°C"));
font.setPixelSize(96);
painter.setFont(font);
int i = m_temperature * 10;
m_temperature = (float)i / 10; //保留一位小数
QString strTemp = QString::number(m_temperature) + QString("°C");
painter.drawText(50, 120, 200, 80, Qt::AlignCenter, QString::number(m_temperature));
painter.restore();
}
效果:
完整代码:
#ifndef DRAWDASHBOARD_H
#define DRAWDASHBOARD_H
#include <QWidget>
#include <QPainter>
class DrawDashboard: public QWidget
{
Q_OBJECT
public:
DrawDashboard(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
private:
void drawArc(QPainter &painter);
void drawScale(QPainter &painter, int radius); //画刻度
void drawScaleValue(QPainter &painter, int radius); //画刻度值
void drawTemperature(QPainter &painter, int width); //画温度
void drawPoint(QPainter &painter, int radius);
void drawDigital(QPainter &painter, int radius);
void drawCircle(QPainter &painter, int radius);
void drawSmallScale(QPainter &painter, int radius);
void drawBigScale(QPainter &painter, int radius);
void drawText(QPainter &painter, int radius);
void drawPointer(QPainter &painter, int radius);
void drawIndicator(QPainter &painter, int radius);
public slots:
void slotValueChanged(int value);
void slotTemperatureValueChanged(int value);
private:
int degRotate{-120};
float m_temperature{3.0f};
QPixmap m_pixmap;
};
#endif // DRAWDASHBOARD_H
#include "drawdashboard.h"
#include <QPen>
#include <QBrush>
#include <QRect>
#include <QPainterPath>
#include <QRadialGradient>
#include <QtMath>
#include <QDebug>
#include <vector>
#define PI 3.14159
DrawDashboard::DrawDashboard(QWidget *parent)
:QWidget(parent)
{
m_pixmap = QPixmap(":/image/dashboard.png");
}
void DrawDashboard::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//绘制背景
painter.setPen(Qt::NoPen);
painter.fillRect(this->rect(), Qt::gray);
painter.drawPixmap(0, 0, m_pixmap);
drawArc(painter);
int width = this->width();
int height = this->height();
int radius = ((width > height) ? height : width) / 2;
painter.translate(width/2, height/2);
drawScale(painter, radius);
drawScaleValue(painter, radius - 25);
//恢复正常坐标
painter.translate(-width/2, -height/2);
drawTemperature(painter, width);
//移动画笔到中下方
//painter.translate(width/2, height*0.6);
//设置画刷颜色
//painter.setPen(Qt::NoPen);
//painter.setBrush(QColor(138, 43, 226));
//drawPoint(painter, radius);
//drawDigital(painter, radius - 10);
//drawCircle(painter, radius - 35);
//drawSmallScale(painter, radius - 60);
//drawBigScale(painter, radius - 75);
//drawText(painter, radius / 2);
//drawPointer(painter, radius - 100);
}
void DrawDashboard::drawArc(QPainter &painter)
{
m_temperature = (m_temperature > 54) ? 54 : m_temperature;
m_temperature = (m_temperature < -18) ? -18 : m_temperature;
QColor color;
if(m_temperature <= 0 || m_temperature >= 35)
color = QColor("#FF0000");
else if(m_temperature > 3 && m_temperature < 32)
color = QColor("#28C840");
else
color = QColor("#FBC320");
QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
QRect rectangle(11, 11, 278, 278);//px, px, w, h
//度数对应数学的象限度数
int startAngle = 0 * 16;
int spanAngle = 270 * 16;
//绘制圆弧: 绘制由给定矩形 startAngle 和 spanAngle 定义的圆弧。startAngle 和 spanAngle 必须以 1/16 度为单位指定,
// 即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度位于 3 点钟位置。
//矩形区域 起始角度 偏转角度
//painter.drawArc(rectangle, startAngle, spanAngle);
int startPos = 180 * 16; //9点钟位置
if(m_temperature > 0)
{
//正数
//float endPos = -5.4 * 16 * m_temperature; //顺时针旋转270度 270.0 / 50 = 5.4
float endPos = -5 * 16 * m_temperature; //顺时针旋转270度 270.0 / 54 = 5
painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
}
else
{
//负数
//float endPos = -9 * 16 * m_temperature; //顺时针旋转90度 90 / 10 = 9
float endPos = -5 * 16 * m_temperature; //顺时针旋转90度 90 / 18 = 5
painter.drawArc(rectangle, startPos, static_cast<int>(endPos));
}
}
void DrawDashboard::drawScale(QPainter &painter, int radius)
{
int w = width();
int h = height();
//int radius = qMin(w, h) / 2;
QPoint center(w / 2, h / 2);
//painter.setPen(QPen(Qt::black, radius * 0.05));
painter.setPen(QPen(QColor("#DDDDDD"), 1));
painter.setBrush(QBrush(QColor("#FFFFFF")));
QRectF rectangle(0, 0, 24, 4);
std::vector<int> vecVal{0, 3, 35};//0刻度 3刻度 35刻度
for (size_t i = 0; i < vecVal.size(); ++i) {
float flo = vecVal[i];
int val = vecVal[i];
if(val == 0 && m_temperature < 0)
flo = 6.5;
else
flo = val + 6;
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-30 + flo * 5.0);
painter.drawRoundedRect(rectangle, 2, 2);
painter.restore();
}
// //painter.setBrush(QBrush(QColor("#ff0000")));
// //for (int i = 6; i <= 54; ++i)
// float i = 6;
// while (i <= 56) {
// QPointF point(0, 0);
// painter.save();
// float f = i;
// if(i == 6)
// f = 5.5;
// //计算并移动绘图对象中心点
// point.setX(radius*qCos(((210 - f * 5.4) * M_PI) / 180));
// point.setY(radius*qSin(((210 - f * 5.4) * M_PI) / 180));
// //计算并移动绘图对象的中心点
// painter.translate(point.x(), -point.y());
// //计算并选择绘图对象坐标
// painter.rotate(-30 + f * 5.4);
// painter.drawRoundedRect(rectangle, 2, 2);
// painter.restore();
// i += 1;
// }
// painter.setBrush(QBrush(QColor("#563582")));
// for (int i = 0; i <= 11; ++i) {
// //int angle = i * 30;
// //QPainter::drawLine(int x1, int y1, int x2, int y2)
// //QPainter::drawLine(const QPoint &p1, const QPoint &p2)
QPoint p1 = center + QPoint(radius * cos(angle * M_PI / 180.0), radius * sin(angle * M_PI / 180.0));
QPoint p2 = center + QPoint((radius - radius * 0.15) * cos(angle * M_PI / 180.0), (radius - radius * 0.15) * sin(angle * M_PI / 180.0));
qDebug() << "DrawDashboard::drawScale==i==" << i << " p1=" << p1 << " p2=" << p2;
// //painter.drawLine(p1, p2);
// QPointF point(0, 0);
// painter.save();
// //计算并移动绘图对象中心点
// point.setX(radius*qCos(((210 - i * 20) * M_PI) / 180));
// point.setY(radius*qSin(((210 - i * 20) * M_PI) / 180));
// //计算并移动绘图对象的中心点
// painter.translate(point.x(), -point.y());
// //计算并选择绘图对象坐标
// //painter.rotate(-120 + i * 20);
// painter.rotate(-30 + i * 20);
// painter.drawRoundedRect(rectangle, 2, 2);
// painter.restore();
// }
}
void DrawDashboard::drawScaleValue(QPainter &painter, int radius)
{
//设置画笔,画笔默认NoPen
painter.setPen(QColor(153, 153, 153)); //#999999
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(12);
painter.setFont(font);
std::vector<int> vecVal{0, 3, 35};//0刻度 3刻度 35刻度
for (size_t i = 0; i < vecVal.size(); ++i) {
float flo = vecVal[i];
int val = vecVal[i];
if(val == 0 && m_temperature < 0)
flo = 6.5;
else
flo = val + 6;
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - flo * 5.0)*M_PI)/180));
point.setY(radius * qSin(((210 - flo * 5.0)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-120 + flo * 5.0);
painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(vecVal[i]));
painter.restore();
}
// painter.setBrush(QBrush(QColor("#ff0000")));
// for (int i = 6; i <= 54; ++i)
// {
// QPointF point(0, 0);
// painter.save();
// float f = i;
// if(i == 6)
// f = 5.5;
// //计算并移动绘图对象中心点
// point.setX(radius*qCos(((210 - f * 5.4) * M_PI) / 180));
// point.setY(radius*qSin(((210 - f * 5.4) * M_PI) / 180));
// //计算并移动绘图对象的中心点
// painter.translate(point.x(), -point.y());
// //计算并选择绘图对象坐标
// painter.rotate(-120 + f * 5.4);
// painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(i-6));
// painter.restore();
// }
// for(int i = 0; i < 13; ++i)
// {
// QPointF point(0, 0);
// painter.save();
// point.setX(radius * qCos(((210 - i * 20)*M_PI)/180));
// point.setY(radius * qSin(((210 - i * 20)*M_PI)/180));
// painter.translate(point.x(), -point.y());
// painter.rotate(-120 + i * 20);
// //painter.drawText(-15, -5, 40, 30, Qt::AlignCenter, QString::number(i*20));
// painter.drawText(-15, -5, 30, 30, Qt::AlignCenter, QString::number(i*2));
// painter.restore();
// }
//还原画笔
painter.setPen(Qt::NoPen);
}
void DrawDashboard::drawTemperature(QPainter &painter, int width)
{
painter.save();
m_temperature = (m_temperature > 54) ? 54 : m_temperature;
m_temperature = (m_temperature < -18) ? -18 : m_temperature;
QColor color;
if(m_temperature <= 0 || m_temperature >= 35)
color = QColor("#FF0000");
else if(m_temperature > 3 && m_temperature < 32)
color = QColor("#28C840");
else
color = QColor("#FBC320");
//QPen pen(color, 8, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
//painter.setPen(pen);
painter.setPen(color);
QFont font;
font.setFamily("Microsoft YaHei");
font.setPixelSize(14);
painter.setFont(font);
QString strText = QString("正常水温");
painter.drawText(20, 70, width - 40, 16, Qt::AlignCenter, strText);
font.setPixelSize(12);
painter.setFont(font);
painter.drawText(220, 102, 14, 14, Qt::AlignCenter, QString("°C"));
font.setPixelSize(96);
painter.setFont(font);
int i = m_temperature * 10;
m_temperature = (float)i / 10; //保留一位小数
QString strTemp = QString::number(m_temperature) + QString("°C");
painter.drawText(50, 120, 200, 80, Qt::AlignCenter, QString::number(m_temperature));
painter.restore();
}
//绘制外圈点
void DrawDashboard::drawPoint(QPainter &painter, int radius)
{
//组装点的路径图
QPainterPath pointPath;
int scale = 2;
pointPath.moveTo(-2 * scale, -2 * scale);
pointPath.lineTo(2 * scale, -2 * scale);
pointPath.lineTo(2 * scale, 2 * scale);
pointPath.lineTo(0, 4 * scale);
pointPath.lineTo(-2 * scale, 2 * scale);
//绘制13个小点
for(int i = 0; i < 13; ++i)
{
QPointF point(0, 0);
painter.save();
painter.setBrush(QColor(255, 127, 80));
//计算并移动绘图对象中心点
point.setX(radius*qCos(((210 - i * 20) * M_PI) / 180));
point.setY(radius*qSin(((210 - i * 20) * M_PI) / 180));
//计算并移动绘图对象的中心点
painter.translate(point.x(), -point.y());
//计算并选择绘图对象坐标
painter.rotate(-120 + i * 20);
//绘制路径
painter.drawPath(pointPath);
painter.restore();
}
}
//绘制外圈数字,原理和绘制圆圈点一样
void DrawDashboard::drawDigital(QPainter &painter, int radius)
{
//设置画笔,画笔默认NoPen
painter.setPen(QColor(218, 112, 214));
QFont font;
font.setFamily("Cambria");
font.setPixelSize(15);
painter.setFont(font);
for(int i = 0; i < 13; ++i)
{
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - i * 20)*M_PI)/180));
point.setY(radius * qSin(((210 - i * 20)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-120 + i * 20);
painter.drawText(-15, -5, 40, 30, Qt::AlignCenter, QString::number(i*20));
painter.restore();
}
//还原画笔
painter.setPen(Qt::NoPen);
}
//绘制外圈
void DrawDashboard::drawCircle(QPainter &painter, int radius)
{
//保存绘图对象
painter.save();
//计算大小圆路径
QPainterPath outRing;
QPainterPath inRing;
outRing.moveTo(0, 0);
inRing.moveTo(0, 0);
outRing.arcTo(-radius, -radius, 2 * radius, 2 * radius, -31, 242);
inRing.addEllipse(-radius + 20, -radius + 20, 2 * (radius - 20), 2 *(radius-20));
outRing.closeSubpath();
//设置渐变色k
QRadialGradient radialGradient(0, 0, radius, 0, 0);
radialGradient.setColorAt(0.93, QColor(138, 43, 226));
radialGradient.setColorAt(1, QColor(0, 0, 0));
//设置画刷
painter.setBrush(radialGradient);
//大圆减小圆
painter.drawPath(outRing.subtracted(inRing));
painter.restore();
}
//绘制刻度
void DrawDashboard::drawSmallScale(QPainter &painter, int radius)
{
//组装点的路径图
QPainterPath pointPath;
pointPath.moveTo(-2, -2);
pointPath.lineTo(-1, -4);
pointPath.lineTo(1, -4);
pointPath.lineTo(2, -2);
pointPath.lineTo(1, 8);
pointPath.lineTo(-1, 8);
//绘制121个小点
for(int i = 0; i < 121; ++i)
{
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - i * 2) * M_PI) / 180));
point.setY(radius * qSin(((210 - i * 2) * M_PI) / 180));
painter.translate(point.x(), -point.y());
painter.rotate(-120 + i * 2);
if(i >= 90)
painter.setBrush(QColor(250, 0, 0));
painter.drawPath(pointPath);
painter.restore();
}
}
//绘制刻度
void DrawDashboard::drawBigScale(QPainter &painter, int radius)
{
//组装点的路径图
QPainterPath pointPath1;
pointPath1.moveTo(-2, -2);
pointPath1.lineTo(-1, -4);
pointPath1.lineTo(1, -4);
pointPath1.lineTo(2, -2);
pointPath1.lineTo(1, 8);
pointPath1.lineTo(-1, 8);
QPainterPath pointPath2;
pointPath2.moveTo(-2, -2);
pointPath2.lineTo(-1, -4);
pointPath2.lineTo(1,-4);
pointPath2.lineTo(2, -2);
pointPath2.lineTo(1, 15);
pointPath2.lineTo(-1, 15);
//绘制25个刻度
for(int i = 0; i < 25; ++i)
{
QPointF point(0, 0);
painter.save();
point.setX(radius * qCos(((210 - i * 10) * M_PI) / 180));
point.setY(radius * qSin(((210 - i * 10) * M_PI) / 180));
painter.translate(point.x(), -point.y());
painter.rotate(-120 + i * 10);
if(i >= 18)
painter.setBrush(QColor(250, 0, 0));
if(i % 2)
{
painter.drawPath(pointPath1);
}
else
{
painter.drawPath(pointPath2);
}
painter.restore();
}
}
//绘制中心文字km/h
void DrawDashboard::drawText(QPainter &painter, int radius)
{
painter.save();
painter.setPen(QColor(153, 51, 250));
QFont font;
font.setFamily("Cambria");
font.setPointSize(16);
painter.setFont(font);
painter.drawText(-25, -radius, 80, 30, Qt::AlignCenter, QString("km/h°C"));
painter.restore();
}
//绘制指针
void DrawDashboard::drawPointer(QPainter &painter, int radius)
{
//组装点的路径图
QPainterPath pointPath;
pointPath.moveTo(10, 0);
pointPath.lineTo(1, -radius);
pointPath.lineTo(-1, -radius);
pointPath.lineTo(-10, 0);
pointPath.arcTo(-10, 0, 20, 20, 180, 180);
QPainterPath inRing;
inRing.addEllipse(-5, -5, 10, 10);
painter.save();
QRadialGradient radialGradient(0, 0, radius, 0, 0);
radialGradient.setColorAt(0, QColor(0, 199, 140, 150));
radialGradient.setColorAt(1, QColor(255, 153, 18, 150));
//计算并选择绘衅对象坐标
painter.rotate(degRotate);
painter.setBrush(radialGradient);
painter.drawPath(pointPath.subtracted(inRing));
painter.restore();
}
void DrawDashboard::drawIndicator(QPainter &painter, int radius)
{
}
void DrawDashboard::slotValueChanged(int value)
{
this->degRotate = value;
update();
}
void DrawDashboard::slotTemperatureValueChanged(int value)
{
int iVal = value * 10;
m_temperature = (float)iVal / 10; //保留一位小数
update();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initData();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "drawdashboard.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initData();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initData()
{
ui->hSliderTemperature->setRange(-18, 54);
ui->hSliderTemperature->setSingleStep(1);
ui->hSliderTemperature->setPageStep(1);
ui->widget->setGeometry(10, 10, 300, 300);
connect(ui->hSliderTemperature, SIGNAL(valueChanged(int)), ui->widget, SLOT(slotTemperatureValueChanged(int)));
}
效果:
参考:
https://www.jb51.net/article/236740.htm
https://www.jb51.net/article/176862.htm
https://blog.csdn.net/hw5230/article/details/132365548