QChart控件:图例QLegend

QChart 中,图例(QLegend)是展示数据系列标识的重要组件,除了基本样式修改,还支持丰富的交互操作和自定义功能。以下是关于图例操作的详细说明,包括交互控制、事件响应、动态调整等。

一、图例基本操作

  1. 显示或隐藏图例
QChart *chart = new QChart();
QLegend *legend = chart->legend();

legend->setVisible(true);  // 显示图例(默认)
legend->setVisible(false); // 隐藏图例
  1. 调整图例位置
    通过 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会隐藏;再次点击则显示

三、监听图例项点击事件(自定义响应)

如果需要自定义图例项的点击行为(如弹窗提示、日志输出等),可以监听 QLegendMarkerclicked 信号:

// 获取所有图例项(每个系列对应一个 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_NAMESPACE

int 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();
}

图例操作的核心能力包括:

  • 基础控制:显示/隐藏、位置调整、布局排列。
  • 交互功能:默认点击切换系列显示,或通过信号槽自定义点击行为。
  • 样式定制:整体样式(字体、背景)和单个图例项的样式(文字、颜色)。
  • 动态管理:单独隐藏某个图例项、修改其名称或关联的系列属性。

通过灵活运用这些操作,可以增强图表的交互性和可读性,满足不同场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值