QGraphicsPixmapItem 在 QGraphicsScene 中缩放和旋转时的奇怪绘图行为
Strange drawing behavior for QGraphicsPixmapItem in a zoomed and rotated in QGraphicsScene
我在 QGraphicsScene 中有一个 QGraphicsPixmapItem,然后我在 QGraphicsView 中放大并旋转它。如果没有旋转或者我没有放大太多,一切都很好,但是当我放大(像素非常明显)并围绕奇怪的东西旋转时,一切都会发生。有时图像看起来像我预期的那样,有时像素图消失(部分或完全),有时图像上出现水平渐变(即使图像旋转它们也保持水平)。
第一张图片是一个图表(应该没有颜色渐变),上面有一个单独的网格(线的集合)。第二张图片来自我的最小示例(下图),显示了部分缺失的像素图(镜头远离像素图的边缘)。
以下是一个简单示例,它演示了我所看到的大部分内容。
#ifndef VIEW_H
#define VIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>
class View : public QGraphicsView
{
Q_OBJECT
public:
explicit View(QWidget *parent = 0) :
QGraphicsView(parent)
{
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/chart.png"));
pixmapItem->setTransformationMode(Qt::SmoothTransformation);
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);
setScene(scene);
}
protected Q_SLOTS:
void wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
scale(1.25, 1.25);
else
scale(0.8, 0.8);
}
void keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Left)
rotate(1);
else if(event->key() == Qt::Key_Right)
rotate(-1);
}
};
#endif // VIEW_H
围绕它的其他文件是一个带有图像的资源文件,一个 QMainWindow class 在其 ui 中保存 View,以及一个执行 main window class,所有这些都在Github project。
重现使用鼠标滚轮放大并使用箭头键旋转(您也可以使用鼠标平移)。如果你放大到足够远并旋转,像素图将在某些角度消失(部分或完全)。我还无法在这个例子中重新创建渐变,但我怀疑它们只是同一问题的另一种表现。
我已经尝试将变换设置为 SmoothTransformation 并将 renderHint 设置为 Antialiasing 和 HighQualityAntialiasing,但两者都没有产生重大影响(抗锯齿确实可以消除高变焦时的锯齿)。此外,我尝试在 QGraphicView、QGraphicsScene 相关绘图中切换许多标志。有谁知道为什么会发生这种情况,或者我可以尝试解决什么问题?
我在 2016 年 10 月 18 日下载的 Qt 4.8.2 和 Qt 5.5.1 中都看到了这个问题,作为 Qt 的当前稳定版本。
看来这可能与limitation of x11有关。基本上,一旦达到足够大的缩放比例,就会达到最大尺寸值。
我仍然不完全确定为什么旋转会影响事物,但作为一种推测,这可能是因为它与图像的边界矩形的大小有关,它会在不同的角度发生变化。我看到的渐变也很奇怪,图像只是部分消失,但似乎它们都是相关的,这是另一种表现形式。
我在 QGraphicsScene 中有一个 QGraphicsPixmapItem,然后我在 QGraphicsView 中放大并旋转它。如果没有旋转或者我没有放大太多,一切都很好,但是当我放大(像素非常明显)并围绕奇怪的东西旋转时,一切都会发生。有时图像看起来像我预期的那样,有时像素图消失(部分或完全),有时图像上出现水平渐变(即使图像旋转它们也保持水平)。
第一张图片是一个图表(应该没有颜色渐变),上面有一个单独的网格(线的集合)。第二张图片来自我的最小示例(下图),显示了部分缺失的像素图(镜头远离像素图的边缘)。
以下是一个简单示例,它演示了我所看到的大部分内容。
#ifndef VIEW_H
#define VIEW_H
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>
class View : public QGraphicsView
{
Q_OBJECT
public:
explicit View(QWidget *parent = 0) :
QGraphicsView(parent)
{
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/chart.png"));
pixmapItem->setTransformationMode(Qt::SmoothTransformation);
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(pixmapItem);
setScene(scene);
}
protected Q_SLOTS:
void wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
scale(1.25, 1.25);
else
scale(0.8, 0.8);
}
void keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Left)
rotate(1);
else if(event->key() == Qt::Key_Right)
rotate(-1);
}
};
#endif // VIEW_H
围绕它的其他文件是一个带有图像的资源文件,一个 QMainWindow class 在其 ui 中保存 View,以及一个执行 main window class,所有这些都在Github project。
重现使用鼠标滚轮放大并使用箭头键旋转(您也可以使用鼠标平移)。如果你放大到足够远并旋转,像素图将在某些角度消失(部分或完全)。我还无法在这个例子中重新创建渐变,但我怀疑它们只是同一问题的另一种表现。
我已经尝试将变换设置为 SmoothTransformation 并将 renderHint 设置为 Antialiasing 和 HighQualityAntialiasing,但两者都没有产生重大影响(抗锯齿确实可以消除高变焦时的锯齿)。此外,我尝试在 QGraphicView、QGraphicsScene 相关绘图中切换许多标志。有谁知道为什么会发生这种情况,或者我可以尝试解决什么问题?
我在 2016 年 10 月 18 日下载的 Qt 4.8.2 和 Qt 5.5.1 中都看到了这个问题,作为 Qt 的当前稳定版本。
看来这可能与limitation of x11有关。基本上,一旦达到足够大的缩放比例,就会达到最大尺寸值。
我仍然不完全确定为什么旋转会影响事物,但作为一种推测,这可能是因为它与图像的边界矩形的大小有关,它会在不同的角度发生变化。我看到的渐变也很奇怪,图像只是部分消失,但似乎它们都是相关的,这是另一种表现形式。