You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt5.15绘制甘特图时QChart未填满ChartView出现镜像重复条问题

你遇到的重复绿色条形问题是两个原因共同导致的:

  1. QBrush默认使用Qt::RepeatPattern平铺模式,当你把QImage作为画刷设置给plotArea背景时,如果plotArea尺寸和图片尺寸不匹配,画刷会自动平铺填充,导致条形重复出现。
  2. 你在控件初始化阶段就获取chartView和plotArea的尺寸,此时控件还未完成首次布局渲染,拿到的宽高都是错误的初始值,绘制出来的图片尺寸和实际plotArea尺寸不匹配,进一步触发了平铺问题。

修复方案

第一步:修改画刷填充模式,禁止平铺

给背景画刷设置Qt::StretchPattern模式,让图片自动拉伸适配plotArea的大小,不会重复平铺。

第二步:调整绘制时机,保证拿到正确尺寸

不要在初始化代码里直接绘制背景,应该监听chartView的大小变化事件,每次尺寸更新后重新绘制背景图,保证尺寸匹配。

修改后的完整代码示例:

// 头文件类中添加事件过滤器声明
// protected:
//     bool eventFilter(QObject *watched, QEvent *event) override;

// 初始化部分代码
ui.setupUi(parent);
QGridLayout *gridLayout = new QGridLayout(ui.widget);

// 构建折线序列
QtCharts::QLineSeries *series = new QtCharts::QLineSeries();
*series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);

// 初始化图表
QtCharts::QChart *chart = new QtCharts::QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->axes(Qt::Vertical).first()->setGridLineVisible(false);
chart->axes(Qt::Horizontal).first()->setGridLineVisible(false);

// 初始化图表视图
QtCharts::QChartView* chartView = new QtCharts::QChartView();
gridLayout->addWidget(chartView);
chartView->setChart(chart);
chartView->setRenderHint(QPainter::Antialiasing, true);
// 给chartView安装事件过滤器,监听大小变化
chartView->installEventFilter(this);

// 事件过滤器实现(放在类的cpp文件中)
bool YourClass::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == chartView && event->type() == QEvent::Resize) {
        auto chart = chartView->chart();
        // 拿到当前正确的尺寸
        int ViewW = chartView->width();
        int ViewH = chartView->height();
        QPointF TopLeft = chart->plotArea().topLeft();
        QPointF BotRight = chart->plotArea().bottomRight();

        // 绘制背景图
        QImage translated(ViewW, ViewH, QImage::Format_ARGB32);
        translated.fill(Qt::gray);
        QPainter painter(&translated);
        painter.fillRect(TopLeft.x(), TopLeft.y(), 10, BotRight.y() - TopLeft.y(), Qt::green);
        painter.end();

        // 设置背景画刷,指定拉伸模式,禁止平铺
        QBrush bgBrush(translated);
        bgBrush.setStyle(Qt::StretchPattern);
        chart->setPlotAreaBackgroundBrush(bgBrush);
        chart->setPlotAreaBackgroundVisible(true);
    }
    return QObject::eventFilter(watched, event);
}

优化建议

不需要通过绘制背景图的方式添加条形,你可以直接使用QtCharts::QBarSeries或者自定义QGraphicsItem添加到chart的scene中,比修改背景的方式更灵活,也不会出现尺寸适配的问题。

内容的提问来源于stack exchange,提问作者ttarter3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:06:04