首页 > 解决方案 > QGraphicsView 中的背景在缩小时会产生锯齿

问题描述

我试图在QGraphicsScene一个可以缩小的视图中有一个背景网格。我面临的问题是我无法摆脱超过某个缩放级别的锯齿。

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QHBoxLayout>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    QGraphicsView *createView(QHBoxLayout *layout, QGraphicsScene *scene, qreal scale) {
        auto *view = new QGraphicsView();
        layout->addWidget(view);
        view->setScene(scene);
#ifdef ANTIALIAS
        view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); // helps, but only partly
#endif
        view->scale(scale, scale);
        return view;
    }

    MainWidget(QWidget *parent = nullptr) : QWidget(parent) {
        resize(800, 200);
        auto *horizontalLayout = new QHBoxLayout(this);
        auto *scene = new QGraphicsScene();

        for (qreal i=1; i>0.3; i/=1.2)
            createView(horizontalLayout, scene, i);

        QPixmap pixmap(QSize(40, 40));
        pixmap.fill();

        QPainter painter(&pixmap);
        painter.setPen(QPen(Qt::black, 1, Qt::DotLine));
        painter.drawLine(0, 0, 0, 40);
        painter.drawLine(0, 0, 40, 0);
        painter.end();

        scene->setBackgroundBrush(pixmap);
    }
};
#endif // MAINWIDGET_H
#include "mainwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;
    w.show();
    return a.exec();
}

添加setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform)到视图中会有所帮助,但不如我希望的那么多,如下面的屏幕截图所示。

没有#define ANTIALIAS没有抗锯齿

#define ANTIALIAS在此处输入图像描述

当前每个缩放步长都设置为缩小 1.2 倍,但似乎这并没有太大影响。

我怎样才能让它更好地缩放,或者至少在某个时候停止绘制网格?有什么我想念的吗?我尝试使用不同的附加渲染提示(包括将它们设置为painter用于绘制背景),但我一定错过了正确的提示。

标签: qtqgraphicsviewantialiasingqgraphicsscene

解决方案


推荐阅读