在简易版中我们只绘制了简单的文本和数值。改进版我们将速度和高度设计成滚动的刻度,并显示刻度值。添加航迹标和高度选择指针。
1. 速度和高度滚动刻度实现
实现步骤
- 定义滚动刻度
- 使用
QPainter
绘制一组分布均匀的刻度线和对应的数值。 - 刻度值随着飞行参数(速度、高度)的变化而动态滚动。
- 绘制指示框
- 在固定位置绘制一个窗口,作为指示器。
- 通过移动刻度,实现滚动效果。
- 实时更新数值
- 实现信号槽机制或定时器(
QTimer
)动态更新速度和高度,并重新绘制滚动效果。
完整代码示例
#include <QWidget>
#include <QPainter>
#include <QTimer>
public PFDWidget : public QWidget {
Q_OBJECT
public:
explicit PFDWidget(QWidget *parent = nullptr)
: QWidget(parent), 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);
// 绘制速度滚动刻度
drawAirspeedScale(painter);
}
private:
double airspeed;
double altitude;
void drawAirspeedScale(QPainter &painter) {
int centerY = height() / 2;
int scaleWidth = 60;
// 保存状态
painter.save();
// 设置绘图区域
QRect airspeedRect(10, 10, scaleWidth, height()-20);
painter.setClipRect(airspeedRect);
// 绘制背景框
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::darkGray);
painter.drawRect(airspeedRect);
// 绘制刻度
painter.setPen(Qt::white);
int step = 10;
int range = 5;
int startValue = static_cast<int>(airspeed/step) *step;
for(int i=-range; i<=range; ++i) {
int value = startValue + i * step;
int y = centerY + (i * 30) - static_cast<int>((airspeed - startValue) * 3);
if(y >= 10 && y <= height() - 10) {
painter.drawText(10, y, scaleWidth-20, 20, Qt::AlignRight, QString::number(value));
painter.drawLine(scaleWidth-20, y, scaleWidth-5, y);
}
}
// 绘制固定指示框
painter.setPen(Qt::yellow);
painter.drawRect(5, centerY -