QwtScaleWidget 是坐标轴的显示控件,负责绘制刻度线、刻度标签和轴标题。它是 QwtPlot 坐标轴系统的基础组件,也支持独立使用。
主要功能特性
特性
- ✅ 刻度绘制:绘制主刻度、次刻度和刻度标签
- ✅ 轴标题:支持显示坐标轴标题文字
- ✅ 内置交互:支持鼠标拖动平移和滚轮缩放(Qwt7新增)
- ✅ 颜色条:支持显示颜色条(用于光谱图)
- ✅ 样式自定义:可自定义刻度长度、标签字体等
基本概念
坐标轴位置
Qwt 使用 QwtAxis::Position 枚举标识坐标轴位置:
| 位置 |
枚举值 |
说明 |
| 底部X轴 |
QwtAxis::XBottom |
底部水平轴 |
| 顶部X轴 |
QwtAxis::XTop |
顶部水平轴 |
| 左侧Y轴 |
QwtAxis::YLeft |
左侧垂直轴 |
| 右侧Y轴 |
QwtAxis::YRight |
右侧垂直轴 |
坐标轴组成结构
| 标题
时间(s)
↓
────────┼────┼────┼────┼────→ 刻度线
0 2 4 6 8 刻度标签
刻度分为:主刻度(长)、次刻度(短)
|
使用方法
1. 通过QwtPlot设置坐标轴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #include <QwtPlot>
QwtPlot* plot = new QwtPlot();
// 设置坐标轴标题
plot->setAxisTitle(QwtAxis::XBottom, "时间 (s)");
plot->setAxisTitle(QwtAxis::YLeft, "电压 (V)");
// 设置坐标轴范围
plot->setAxisScale(QwtAxis::XBottom, 0, 100); // X轴0-100
plot->setAxisScale(QwtAxis::YLeft, -10, 10); // Y轴-10到10
// 设置坐标轴可见性
plot->setAxisVisible(QwtAxis::XTop, false); // 隐藏顶部X轴
plot->setAxisVisible(QwtAxis::YRight, true); // 显示右侧Y轴
plot->replot();
|
2. 获取坐标轴控件
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | // 获取特定位置的坐标轴控件
QwtScaleWidget* scaleWidget = plot->axisWidget(QwtAxis::XBottom);
// 设置刻度标签字体
scaleWidget->setFont(QFont("Arial", 8));
// 设置轴标题样式
QwtText title("时间 (s)");
title.setFont(QFont("Arial", 10, QFont::Bold));
title.setColor(Qt::darkBlue);
scaleWidget->setTitle(title);
// 设置刻度颜色
scaleWidget->setPalette(QPalette(Qt::black));
|
3. 内置交互功能(Qwt7新增)
Qwt 7.0 新增了坐标轴内置交互功能,支持在坐标轴上直接进行平移和缩放操作:
1
2
3
4
5
6
7
8
9
10
11
12 | // 获取坐标轴控件
QwtScaleWidget* scaleWidget = plot->axisWidget(QwtAxis::XBottom);
// 启用内置平移功能
scaleWidget->setBuiltInAction(QwtScaleWidget::Pan, true);
// 启用内置缩放功能
scaleWidget->setBuiltInAction(QwtScaleWidget::Zoom, true);
// 设置交互的鼠标按钮
scaleWidget->setActionButton(Qt::LeftButton); // 左键拖动平移
scaleWidget->setActionButtons(Qt::MiddleButton, Qt::ControlModifier); // Ctrl+中键缩放
|
平移效果:

缩放效果:

详细的坐标轴交互说明请参考:坐标轴交互动作
4. 颜色条显示
用于光谱图等需要颜色映射的场景:
1
2
3
4
5
6
7
8
9
10
11
12 | // 启用颜色条
scaleWidget->setColorBarEnabled(true);
// 设置颜色条宽度
scaleWidget->setColorBarWidth(20);
// 设置颜色映射
QwtLinearColorMap* colorMap = new QwtLinearColorMap(Qt::blue, Qt::red);
scaleWidget->setColorMap(QwtInterval(0, 100), colorMap);
// 设置颜色条位置
scaleWidget->setColorBarPosition(QwtScaleWidget::Right); // 在刻度右侧
|
5. 刻度绘制样式
| // 设置刻度位置(相对于轴的方向)
scaleWidget->setTickPosition(QwtScaleWidget::Outside); // 刻度在外侧
// 其他选项:Inside(内侧)、Both(双侧)
// 设置刻度长度
scaleWidget->setMajorTickLength(10); // 主刻度长度(像素)
scaleWidget->setMinorTickLength(5); // 次刻度长度(像素)
// 设置刻度边距
scaleWidget->setTickMargin(2); // 刻度与轴线的间距
|
6. 刻度标签格式化
通过设置 QwtScaleDraw 自定义刻度标签格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #include <QwtScaleDraw>
// 自定义刻度绘制
class MyScaleDraw : public QwtScaleDraw
{
public:
virtual QwtText label(double value) const override
{
// 自定义标签格式
return QwtText(QString::number(value, 'f', 1)); // 保留1位小数
}
};
// 应用自定义刻度绘制
scaleWidget->setScaleDraw(new MyScaleDraw());
|
7. 设置刻度划分
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #include <QwtScaleDiv>
#include <QwtScaleEngine>
// 使用自动刻度引擎
plot->setAxisAutoScale(QwtAxis::XBottom); // 自动计算刻度
// 手动设置刻度划分
QwtScaleDiv scaleDiv;
scaleDiv.setInterval(0, 100);
QList<double> majorTicks;
majorTicks << 0 << 25 << 50 << 75 << 100;
scaleDiv.setTicks(QwtScaleDiv::MajorTick, majorTicks);
plot->setAxisScaleDiv(QwtAxis::XBottom, scaleDiv);
|
核心方法总结
QwtPlot坐标轴方法
| 方法 |
说明 |
setAxisTitle() |
设置轴标题 |
setAxisScale() |
设置轴范围 |
setAxisAutoScale() |
启用自动刻度 |
setAxisVisible() |
设置轴可见性 |
axisWidget() |
获取轴控件 |
setAxisMaxMajor() |
设置主刻度数量上限 |
setAxisMaxMinor() |
设置次刻度数量上限 |
| 方法 |
说明 |
setTitle() |
设置轴标题 |
setFont() |
设置标签字体 |
setBuiltInAction() |
启用内置交互 |
setColorBarEnabled() |
启用颜色条 |
setColorMap() |
设置颜色映射 |
setTickPosition() |
设置刻度位置 |
setScaleDraw() |
设置刻度绘制对象 |
坐标轴配置建议
- 对于数值轴,使用自动刻度即可满足大多数需求
- 对于时间轴,使用
QwtDateScaleEngine
- 对于对数轴,使用
QwtLogScaleEngine
相关示例
- 坐标轴交互:
examples/2D 中多个示例
- 颜色条:
examples/2D/spectrogram
- 刻度演示:
playground/scaleengine