在使用 Qt 开发电子飞行显示器(Primary Flight Display,PFD)功能时,
QPainter
是一个非常适合绘制矢量图形的工具。
步骤:
-
创建自定义 QWidget
创建一个自定义的 QWidget 子类,用于绘制 PFD。
-
重写
paintEvent
在
paintEvent
方法中使用QPainter
绘制各种显示组件,例如速度、高度、航向、姿态球等。 -
实现基本绘图逻辑
使用
QPainter
提供的绘图功能(如绘制线条、矩形、圆弧、文本等),绘制PFD核心元素。 -
动态更新数据
使用定时器或信号-槽机制定期更新飞行参数(如速度、高度、航向等),然后调用
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);
}
};
运行效果
- 姿态球:显示飞机的俯仰和横滚角。
- 速度和高度:动态更新显示。
- 航向指示器:显示飞机的航向。
改进方向
- 使用更真实的比例和样式。
- 添加更多的显示元素(例如航迹标、高度选择指针)。
- 支持键盘调整飞行参数。