QChart控件:图例QLegend
QLegend
- 一、图例基本操作
- 二、图例交互操作(点击切换系列显示)
- 三、监听图例项点击事件(自定义响应)
- 四、图例项的单独控制(隐藏/修改样式)
- 五、图例布局与排列
- 六、完整示例:图例交互与自定义
在 QChart
中,图例(QLegend
)是展示数据系列标识的重要组件,除了基本样式修改,还支持丰富的交互操作和自定义功能。以下是关于图例操作的详细说明,包括交互控制、事件响应、动态调整等。
一、图例基本操作
- 显示或隐藏图例
QChart *chart = new QChart();
QLegend *legend = chart->legend();legend->setVisible(true); // 显示图例(默认)
legend->setVisible(false); // 隐藏图例
- 调整图例位置
通过setAlignment()
设置图例在图表中的位置(支持 Qt 对齐枚举):
// 常用位置:顶部、底部、左侧、右侧
legend->setAlignment(Qt::AlignTop); // 顶部
legend->setAlignment(Qt::AlignBottom); // 底部(推荐,不遮挡数据)
legend->setAlignment(Qt::AlignLeft); // 左侧
legend->setAlignment(Qt::AlignRight); // 右侧
二、图例交互操作(点击切换系列显示)
默认情况下,点击图例中的项(QLegendMarker
)会自动隐藏/显示对应的系列,这是 Qt Charts 内置的交互功能:
// 启用/禁用图例交互(默认启用)
legend->setInteractive(true); // 点击图例项切换系列显示状态
legend->setInteractive(false); // 禁用交互(点击无反应)
点击图例项隐藏/显示系列
// 假设已添加两个系列到图表
QLineSeries *series1 = new QLineSeries();
series1->setName("系列1");
QLineSeries *series2 = new QLineSeries();
series2->setName("系列2");
chart->addSeries(series1);
chart->addSeries(series2);// 启用图例交互后,点击“系列1”的图例项,系列1会隐藏;再次点击则显示
三、监听图例项点击事件(自定义响应)
如果需要自定义图例项的点击行为(如弹窗提示、日志输出等),可以监听 QLegendMarker
的 clicked
信号:
// 获取所有图例项(每个系列对应一个 marker)
QList<QLegendMarker*> markers = legend->markers();// 遍历所有图例项,绑定点击事件
foreach (QLegendMarker *marker, markers) {connect(marker, &QLegendMarker::clicked, [=]() {// 自定义响应逻辑:输出被点击的系列名称qDebug() << "点击了图例项:" << marker->series()->name();// 示例:点击后切换系列颜色(覆盖默认的显示/隐藏行为)QLineSeries *series = qobject_cast<QLineSeries*>(marker->series());if (series) {QColor newColor = series->color() == Qt::blue ? Qt::red : Qt::blue;series->setColor(newColor);marker->setBrush(newColor); // 同步更新图例项颜色}});
}
- 若要禁用默认的“点击隐藏系列”行为,需在信号槽中调用
marker->setVisible(true)
强制保持显示,或在交互后手动恢复系列可见性。
四、图例项的单独控制(隐藏/修改样式)
图例中的每个项(QLegendMarker
)可单独操作,例如隐藏某个系列的图例、修改其样式:
// 获取系列对应的图例项(假设已知系列指针)
QLegendMarker* findMarkerForSeries(QChart *chart, QAbstractSeries *targetSeries) {foreach (QLegendMarker *marker, chart->legend()->markers()) {if (marker->series() == targetSeries) {return marker;}}return nullptr;
}// 使用示例:隐藏“系列2”的图例项
QLegendMarker *marker2 = findMarkerForSeries(chart, series2);
if (marker2) {marker2->setVisible(false); // 仅隐藏图例项,系列仍在图表中显示
}// 修改图例项的文字和标记样式
if (marker2) {marker2->setLabel("自定义名称"); // 修改图例项文字(不影响系列本身的名称)marker2->setLabelColor(Qt::green); // 文字颜色marker2->setBrush(Qt::green); // 标记(小方块/线条)颜色marker2->setPen(QPen(Qt::darkGreen, 2)); // 标记边框
}
五、图例布局与排列
当图例项较多时,可调整布局模式(水平/垂直排列)和间距:
// 设置图例项排列方向(默认根据位置自动调整)
legend->setLayoutDirection(Qt::Horizontal); // 水平排列(适合底部/顶部)
legend->setLayoutDirection(Qt::Vertical); // 垂直排列(适合左侧/右侧)// 设置图例与图表边缘的间距
legend->setMargin(10); // 边距 10px// 设置图例项之间的间距
legend->setSpacing(20); // 项间距 20px
六、完整示例:图例交互与自定义
#include <QApplication>
#include <QChart>
#include <QLineSeries>
#include <QChartView>
#include <QLegend>
#include <qDebug>QT_CHARTS_USE_NAMESPACEint main(int argc, char *argv[]) {QApplication a(argc, argv);// 1. 创建图表和系列QChart *chart = new QChart();chart->setTitle("图例交互示例");QLineSeries *series1 = new QLineSeries();series1->setName("温度");*series1 << QPointF(0, 20) << QPointF(1, 25) << QPointF(2, 22);series1->setColor(Qt::red);QLineSeries *series2 = new QLineSeries();series2->setName("湿度");*series2 << QPointF(0, 60) << QPointF(1, 65) << QPointF(2, 58);series2->setColor(Qt::blue);chart->addSeries(series1);chart->addSeries(series2);chart->createDefaultAxes();// 2. 配置图例QLegend *legend = chart->legend();legend->setAlignment(Qt::AlignBottom); // 底部显示legend->setInteractive(true); // 启用交互legend->setSpacing(30); // 项间距 30px// 3. 绑定图例项点击事件(自定义响应)foreach (QLegendMarker *marker, legend->markers()) {connect(marker, &QLegendMarker::clicked, [=]() {QString seriesName = marker->series()->name();qDebug() << "点击了" << seriesName << "的图例项";// 切换系列可见性(覆盖默认行为)bool isVisible = marker->series()->isVisible();marker->series()->setVisible(!isVisible);// 同步更新图例项状态(可选)marker->setVisible(true); // 保持图例项可见});}// 4. 显示图表QChartView *chartView = new QChartView(chart);chartView->resize(800, 600);chartView->show();return a.exec();
}
图例操作的核心能力包括:
- 基础控制:显示/隐藏、位置调整、布局排列。
- 交互功能:默认点击切换系列显示,或通过信号槽自定义点击行为。
- 样式定制:整体样式(字体、背景)和单个图例项的样式(文字、颜色)。
- 动态管理:单独隐藏某个图例项、修改其名称或关联的系列属性。
通过灵活运用这些操作,可以增强图表的交互性和可读性,满足不同场景的需求。