У меня есть QGraphicsPixmapItem в QGraphicsScene, который я затем увеличиваю и поворачиваю в 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, который содержит View в своем пользовательском интерфейсе, и основной, который помещает, выполняет класс главного окна, все из которых доступны в Проект Github.
Для увеличения изображения используйте колесо прокрутки мыши и вращайте его с помощью клавиш со стрелками (вы также можете перемещаться с помощью мыши). Если увеличить изображение и повернуть его, растровое изображение исчезнет (частично или полностью) под некоторыми углами. Мне пока не удалось воссоздать градиенты в этом примере, но я подозреваю, что они являются еще одним проявлением той же проблемы.
Я попытался установить преобразование в SmoothTransformation и установить для renderHint как Antialiasing, так и HighQualityAntialiasing, но ни один из них не оказал существенного эффекта (сглаживание действительно сглаживает неровности при больших масштабах). Кроме того, я попытался включить много флагов в QGraphicView, связанном с QGraphicsScene чертеже. Кто-нибудь знает, почему это может происходить или что я могу попытаться решить?
Я видел эту проблему как в Qt 4.8.2, так и в Qt 5.5.1, которые я скачал 18.10.16 в качестве текущей стабильной версии Qt.
Похоже, что это может иметь какое-то отношение к ограничение х11. Как правило, при достижении достаточно большого увеличения достигается максимальное значение размера.
Я все еще не совсем уверен, почему вращение, кажется, влияет на вещи, но как гипотеза это может быть, потому что это связано с размером ограничивающего прямоугольника изображения, который будет меняться под разными углами. Градиенты, которые я видел, тоже странные, так как изображение только частично исчезает, но, вероятно, все они связаны, и это еще одно проявление.
Других решений пока нет …