在QGraphicsScene中缩放和旋转QGraphicsPixmapItem的奇怪绘图行为

时间:2016-10-18 14:00:11

标签: c++ qt rotation qgraphicsview qgraphicspixmapitem

我在QGraphicsScene中有一个QGraphicsPixmapItem,然后我放大并在QGraphicsView中旋转。如果没有旋转或者我没有放大太远,一切都很好,但是当我放大时(像素非常明显)并且绕着奇怪的事物旋转。有些时候图像看起来像我期望的那样,有些时候像素图消失(部分或完全),有些时候水平渐变出现在图像上(即使图像旋转它们也保持水平)。

image with gradients enter image description here

第一张图片是图表(应该没有颜色渐变),上面有一个单独的网格(线条集合)。第二张图片来自我的最小例子(下图)并显示部分缺失的像素图(镜头远离像素图的边缘)。

以下是一个简单的例子,它展示了我所看到的大部分内容。

#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

围绕它的其他文件是带有图像的资源文件,一个在其ui中保存View的QMainWindow类,以及一个执行主窗口类的main,所有这些都在Github project中可用。

使用鼠标滚轮重新放大并使用箭头键旋转(您也可以使用鼠标平移)。如果放大得足够远并旋转,像素图将在某些角度消失(部分或完全)。我还没有在这个例子中重新创建渐变,但我怀疑它们只是同一问题的另一种表现形式。

我尝试将转换设置为SmoothTransformation并将renderHint设置为Antialiasing和HighQualityAntialiasing,但两者都没有产生重大影响(antialasing确实平滑了高变焦处的锯齿状)。另外,我尝试在QGraphicView,QGraphicsScene相关绘图中编写许多标志。有谁知道为什么会发生这种情况或者我可以尝试解决它?

我在Qt 4.8.2和Qt 5.5.1中都看到了这个问题,我在2016年10月18日下载了Qt当前的稳定版本。

1 个答案:

答案 0 :(得分:0)

这似乎与limitation of x11有关。基本上,一旦达到足够大的变焦,就会击中最大尺寸值。

我仍然不完全确定为什么旋转似乎会影响事物但是作为猜想可能是因为它与图像的边界矩形的大小有关,它将在不同的角度变化。我看到的渐变也是奇怪的,图像只是部分消失,但似乎它们都是相关的,这是另一种表现形式。