做工业上位机的同学一定遇到过这个痛点:Qt 自带控件太丑,第三方库太笨重,自己画又不知道怎么下手。 今天我把一套完整的仪表盘源码拆给你看,从极坐标到坐标变换,从缓存策略到动画系统,全部讲透。看完这篇,你也能写出交付给客户的工业级控件。
最终运行效果:深色工业风,红色指针,支持滑块拖动和随机数值
一、为什么工业软件都离不开仪表盘?
汽车中控、航空驾驶舱、医疗监护仪、工厂 SCADA 系统——这些场景里都有同一个元素:仪表盘。
原因很简单:人类大脑处理「图形位置」的速度比处理「精确数字」快约 50%。紧急工况下,工程师不需要知道「转速 5847 转」,他只需要看到「指针进入红区」。仪表盘把抽象数据转化为直观的空间位置,让信息获取从「阅读理解」降维到「条件反射」。
行业真相工业软件用户体验的核心从来不是「好看」,而是「一眼看懂」。一个优秀的工业控件,必须在 0.3 秒内完成信息传递。指针+圆弧的形态延续了上百年,因为人类对角度变化的感知是刻在基因里的。
二、项目结构一览
整个项目叫QDashboard,结构非常清爽,没有冗余:
QDashboard/
├── src/
│ ├── main.cpp ← 程序入口
│ ├── mainwindow.cpp/h ← 主窗口 & 交互
│ ├── mainwindow.ui ← UI 布局文件
│ └── dashboard/
│ ├── dashboard.h ← 控件接口(蓝图)
│ └── dashboard.cpp ← 核心绘制(灵魂)
├── res/qss/AppStyle.qss ← 样式表
└── QDashboard.pro ← Qt 工程文件
精髓就两个文件:dashboard.h 定义「画什么」,dashboard.cpp 实现「怎么画」。
三、核心源码拆解
3.1 main.cpp —— 大道至简的入口
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCoreApplication::setApplicationName("QDashboard");
QCoreApplication::setApplicationVersion("1.0.0");
MainWindow w;
w.show();
return a.exec();
}
三行核心:创建应用、创建窗口、启动事件循环。优秀的架构,入口一定是最干净的。复杂的东西应该被封装在内部,而不是暴露在门口。
3.2 dashboard.h —— 接口设计是一门艺术
class Dashboard : public QWidget
{
Q_OBJECT
Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(int minValue READ minValue WRITE setMinValue)
Q_PROPERTY(int maxValue READ maxValue WRITE setMaxValue)
public: