Qt 是一个跨平台的 C++ 图形用户界面应用程序框架,广泛用于开发 GUI 应用程序。Qt 提供了丰富的图形绘制功能,使得开发者可以轻松地创建各种自定义控件和图形界面。本文将详细介绍如何使用 Qt 绘制一个温度计控件,包括温度计的外观设计、温度刻度的绘制、温度值的动态更新等。
在开始之前,确保你已经安装了 Qt 开发环境。你可以从 Qt 官方网站 下载并安装 Qt Creator,这是一个集成开发环境(IDE),包含了 Qt 库和工具。
New Project
。Application
-> Qt Widgets Application
,然后点击 Choose...
。ThermometerWidget
,然后选择项目保存路径。Kit Selection
页面,选择你的开发工具链(如 Desktop Qt 5.15.2 MinGW 64-bit)。Next
,然后点击 Finish
完成项目创建。在项目中,我们将创建一个自定义的 ThermometerWidget
类,用于绘制温度计。
Headers
文件夹,选择 Add New...
。C++ Class
,然后点击 Choose...
。ThermometerWidget
,基类选择 QWidget
,然后点击 Next
和 Finish
。在 ThermometerWidget
类中,我们需要定义一些基本属性,如温度计的高度、宽度、温度范围等。
// thermometerwidget.h
#ifndef THERMOMETERWIDGET_H
#define THERMOMETERWIDGET_H
#include <QWidget>
class ThermometerWidget : public QWidget
{
Q_OBJECT
public:
explicit ThermometerWidget(QWidget *parent = nullptr);
void setTemperature(double temperature);
double temperature() const;
protected:
void paintEvent(QPaintEvent *event) override;
private:
double m_temperature;
double m_minTemperature;
double m_maxTemperature;
int m_width;
int m_height;
};
#endif // THERMOMETERWIDGET_H
在 ThermometerWidget
的构造函数中,初始化温度计的基本属性。
// thermometerwidget.cpp
#include "thermometerwidget.h"
#include <QPainter>
ThermometerWidget::ThermometerWidget(QWidget *parent)
: QWidget(parent),
m_temperature(0.0),
m_minTemperature(-20.0),
m_maxTemperature(50.0),
m_width(50),
m_height(200)
{
setFixedSize(m_width, m_height);
}
void ThermometerWidget::setTemperature(double temperature)
{
if (temperature < m_minTemperature)
temperature = m_minTemperature;
if (temperature > m_maxTemperature)
temperature = m_maxTemperature;
m_temperature = temperature;
update(); // 触发重绘
}
double ThermometerWidget::temperature() const
{
return m_temperature;
}
void ThermometerWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制温度计背景
painter.setBrush(Qt::white);
painter.drawRect(0, 0, m_width, m_height);
// 绘制温度计主体
painter.setBrush(Qt::lightGray);
painter.drawRect(10, 10, m_width - 20, m_height - 20);
// 绘制温度计刻度
painter.setPen(Qt::black);
for (int i = 0; i <= 10; ++i) {
int y = 10 + i * (m_height - 20) / 10;
painter.drawLine(10, y, 20, y);
painter.drawText(25, y + 5, QString::number(m_minTemperature + i * (m_maxTemperature - m_minTemperature) / 10));
}
// 绘制温度计液柱
double temperatureRange = m_maxTemperature - m_minTemperature;
double temperatureHeight = (m_temperature - m_minTemperature) / temperatureRange * (m_height - 20);
painter.setBrush(Qt::red);
painter.drawRect(10, m_height - 10 - temperatureHeight, m_width - 20, temperatureHeight);
}
在 mainwindow.cpp
中,添加 ThermometerWidget
控件并设置初始温度。
// mainwindow.cpp
#include "mainwindow.h"
#include "thermometerwidget.h"
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
ThermometerWidget *thermometer = new ThermometerWidget(this);
thermometer->setTemperature(25.0);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(thermometer);
QWidget *centralWidget = new QWidget(this);
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
}
为了让温度计能够动态显示温度变化,我们可以添加一个定时器,定期更新温度值。
在 ThermometerWidget
类中,添加一个 QTimer
成员变量,并在构造函数中启动定时器。
// thermometerwidget.h
#include <QTimer>
class ThermometerWidget : public QWidget
{
Q_OBJECT
public:
explicit ThermometerWidget(QWidget *parent = nullptr);
void setTemperature(double temperature);
double temperature() const;
protected:
void paintEvent(QPaintEvent *event) override;
private slots:
void updateTemperature();
private:
double m_temperature;
double m_minTemperature;
double m_maxTemperature;
int m_width;
int m_height;
QTimer *m_timer;
};
// thermometerwidget.cpp
#include <QTimer>
ThermometerWidget::ThermometerWidget(QWidget *parent)
: QWidget(parent),
m_temperature(0.0),
m_minTemperature(-20.0),
m_maxTemperature(50.0),
m_width(50),
m_height(200)
{
setFixedSize(m_width, m_height);
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &ThermometerWidget::updateTemperature);
m_timer->start(1000); // 每秒更新一次
}
void ThermometerWidget::updateTemperature()
{
// 模拟温度变化
double newTemperature = m_temperature + (qrand() % 10 - 5);
setTemperature(newTemperature);
}
编译并运行程序,你将看到一个动态更新的温度计控件,温度值会每秒变化一次。
在温度计上添加温度单位(如 °C 或 °F),可以让用户更直观地理解温度值。
void ThermometerWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制温度计背景
painter.setBrush(Qt::white);
painter.drawRect(0, 0, m_width, m_height);
// 绘制温度计主体
painter.setBrush(Qt::lightGray);
painter.drawRect(10, 10, m_width - 20, m_height - 20);
// 绘制温度计刻度
painter.setPen(Qt::black);
for (int i = 0; i <= 10; ++i) {
int y = 10 + i * (m_height - 20) / 10;
painter.drawLine(10, y, 20, y);
painter.drawText(25, y + 5, QString::number(m_minTemperature + i * (m_maxTemperature - m_minTemperature) / 10) + "°C");
}
// 绘制温度计液柱
double temperatureRange = m_maxTemperature - m_minTemperature;
double temperatureHeight = (m_temperature - m_minTemperature) / temperatureRange * (m_height - 20);
painter.setBrush(Qt::red);
painter.drawRect(10, m_height - 10 - temperatureHeight, m_width - 20, temperatureHeight);
}
在温度计上方添加一个标题,例如 “Temperature”。
void ThermometerWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制温度计背景
painter.setBrush(Qt::white);
painter.drawRect(0, 0, m_width, m_height);
// 绘制温度计标题
painter.setPen(Qt::black);
painter.drawText(10, 20, "Temperature");
// 绘制温度计主体
painter.setBrush(Qt::lightGray);
painter.drawRect(10, 30, m_width - 20, m_height - 40);
// 绘制温度计刻度
painter.setPen(Qt::black);
for (int i = 0; i <= 10; ++i) {
int y = 30 + i * (m_height - 40) / 10;
painter.drawLine(10, y, 20, y);
painter.drawText(25, y + 5, QString::number(m_minTemperature + i * (m_maxTemperature - m_minTemperature) / 10) + "°C");
}
// 绘制温度计液柱
double temperatureRange = m_maxTemperature - m_minTemperature;
double temperatureHeight = (m_temperature - m_minTemperature) / temperatureRange * (m_height - 40);
painter.setBrush(Qt::red);
painter.drawRect(10, m_height - 10 - temperatureHeight, m_width - 20, temperatureHeight);
}
通过本文的介绍,我们学习了如何使用 Qt 绘制一个简单的温度计控件。我们首先定义了温度计的基本属性,然后实现了温度计的外观绘制和温度值的动态更新。最后,我们还对温度计进行了进一步的优化,添加了温度单位和标题。
Qt 提供了强大的图形绘制功能,使得开发者可以轻松地创建各种自定义控件。希望本文能够帮助你更好地理解 Qt 的图形绘制机制,并为你的项目开发提供一些参考。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://blog.csdn.net/dica54dica/article/details/129626585