【QT】实现电子飞行显示器(简易版)

在使用 Qt 开发电子飞行显示器(Primary Flight Display,PFD)功能时,QPainter 是一个非常适合绘制矢量图形的工具。

步骤

  1. 创建自定义 QWidget

    创建一个自定义的 QWidget 子类,用于绘制 PFD。

  2. 重写 paintEvent

    paintEvent 方法中使用 QPainter 绘制各种显示组件,例如速度、高度、航向、姿态球等。

  3. 实现基本绘图逻辑

    使用 QPainter 提供的绘图功能(如绘制线条、矩形、圆弧、文本等),绘制PFD核心元素。

  4. 动态更新数据

    使用定时器或信号-槽机制定期更新飞行参数(如速度、高度、航向等),然后调用 update() 重绘。

代码示例

以下是一个简单的 PFD 绘图示例:

cpp 复制代码
#include <QWidget>
#include <QPainter>
#include <QTimer>

class PFDWidget : public QWidget {
	Q_OBJECT
public:
	explicit PFDWidget(QWidget *parent = nullptr) 
		: QWidget(parent), rollAngle(0), pitchAngle(0), airspeed(120), altitude(10000) {
		// 定时器更新数据
		QTimer *timer = new QTimer(this);
		connect(timer, &QTimer::timeout, this, &PFDWidget::updateData);
		timer->start(100);		// 每 100ms 更新一次
	}
	
protected:
	void paintEvent(QPaintEvent *event) override {
		QPainter painter(this);
		painter.setRenderHint(QPainter::Antialiasing);

		// 设置背景
		painter.fillRect(rect(), Qt::black);

		// 绘制姿态球
		drawAttitudeIndicator(painter);

		// 绘制速度和高度
		drawAirspeed(painter);
		drawAltitude(painter);

		// 绘制航向指示器
		drawHeadingIndicator(painter);
	}

private:
	double rollAngle;	// 横滚角
	double pitchAngle;	// 俯仰角
	double airspeed;	// 空速
	double altitude;	// 高度

	void drawAttitudeIndicator(QPainter &painter) {
		// 中心位置
		QPoint center(width()/2, height()/2);

		// 保存原始状态
		painter.save();

		// 平移到中心并旋转
		painter.translate(center);
		painter.rotate(rollAngle);

		// 绘制蓝色天空和棕色地面
		painter.setBrush(Qt::blue);
		painter.drawRect(-100, -100, 200, 100);
		painter.setBrush(Qt::darkYellow);
		painter.drawRect(-100, 0, 200, 100);

		// 绘制俯仰角指示线
		painter.setPen(Qt::white);
		for(int i=-90; i<=90; i+=90) {
			int y = -i * 2;		// 简化的比例
			painter.drawLine(-50, y , 50, y);
		}

		// 恢复原始状态
		painter.restore();
	}

	void drawAirspeed(QPainter &painter) {
		painter.setPen(Qt::green);
		painter.drawText(10, height()/2, QString("Airspeed: %1).arg(airspeed));
	}

	void drawAltitude(QPainter &painter) {
		painter.setPen(Qt::yellow);
		painter.drawText(width()-100, height()/2, QString("Altitude: %1).arg(altitude));
	}

	void drawHeadingIndicator(QPainter &painter) {
		painter.setPen(Qt::white);
		painter.drawText(width()/2-50, height()-20, QString("Heading"));
	}

private slots:
	void updateData() {
		// 模拟数据变化
		rollAngle += 1.0;
		if(rollAngle > 360.0)
			rollAngle -= 360.0;

		pitchAngle = qSin(rollAngle * M_PI / 180.0) * 10;	// 模拟俯仰角
		airspeed += 0.1;
		altitude += 0.5;

		// 请求重绘
		update(0);
	}
};

运行效果

  1. 姿态球:显示飞机的俯仰和横滚角。
  2. 速度和高度:动态更新显示。
  3. 航向指示器:显示飞机的航向。

改进方向

  • 使用更真实的比例和样式。
  • 添加更多的显示元素(例如航迹标、高度选择指针)。
  • 支持键盘调整飞行参数。
相关推荐
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
skywalk81631 小时前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
小书房1 小时前
Kotlin的by
android·开发语言·kotlin·委托·by
就叫飞六吧2 小时前
QT写一个桌面程序exe并动态打包基本流程(c++)
开发语言·c++
threelab2 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
V搜xhliang02462 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
kaikaile19952 小时前
风、浪、流环境模型的船舶三自由度(纵荡、横荡、艏摇)运动仿真MATLAB
开发语言·人工智能·matlab
fish_xk2 小时前
map和set
java·开发语言
李崧正2 小时前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命2 小时前
鳶尾花項目JAVA
java·开发语言·机器学习