Qt5.15绘制甘特图时QChart未填满ChartView出现镜像重复条问题
你遇到的重复绿色条形问题是两个原因共同导致的:
- QBrush默认使用
Qt::RepeatPattern平铺模式,当你把QImage作为画刷设置给plotArea背景时,如果plotArea尺寸和图片尺寸不匹配,画刷会自动平铺填充,导致条形重复出现。 - 你在控件初始化阶段就获取
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
相关产品推荐
相关产品推荐

