qt - 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)
到视图中会有所帮助,但不如我希望的那么多,如下面的屏幕截图所示。
当前每个缩放步长都设置为缩小 1.2 倍,但似乎这并没有太大影响。
我怎样才能让它更好地缩放,或者至少在某个时候停止绘制网格?有什么我想念的吗?我尝试使用不同的附加渲染提示(包括将它们设置为painter
用于绘制背景),但我一定错过了正确的提示。
解决方案
推荐阅读
- gradle - 删除Gradle的构建缓存并构建后,一些任务仍然标记为FROM-CACHE
- javascript - 如何使用 javascript 获取自定义 css var 的内联样式
- html - 使用 VBA 对象变量或未设置块变量使用 HTML 抓取数据
- redirect - 带有输入参数的 IIS URL 重定向
- telerik - Telerik Rad电子表格转PDF
- c++ - 如何从函数返回结构
- xamarin - 如何在 Xamarin.Forms 中使用 Android 控件
- amazon-web-services - 将 AWS S3 作为对象存储后如何从 AWS S3 获取可读的电子邮件?
- python-3.x - 如何打印清单?
- maven - 升级到 mvn 3.6.2 后 jenkins maven 失败