2016-10-18 6 views
1

У меня есть QGraphicsPixmapItem в QGraphicsScene, который затем я увеличиваю и поворачиваю в QGraphicsView. Все работает отлично, если нет вращения или если я не задвигаю слишком далеко, однако, когда я увеличиваю масштаб (пиксели очень заметны) и вращаются вокруг странных вещей. Некоторое время изображение выглядит так, как я ожидал бы, некоторое время изображение pixmap исчезает (частично или полностью), а некоторые из них отображаются на изображении горизонтально (они остаются горизонтальными, даже когда изображение вращается).Странное поведение чертежа для QGraphicsPixmapItem в увеличенном и повернутом в QGraphicsScene

image with gradientsenter image description here

Первое изображение представляет диаграммы (не должно быть никаких цветовых градиентов) с отдельной сетки (сбор линий), введенного над ним. Второе изображение получается из моего минимального примера (ниже) и показывает частично отсутствующую pixmap (выстрел находится далеко от края pixmap).

Ниже приведен простой пример, демонстрирующий большую часть того, что я вижу.

#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 project.

Для воспроизведения увеличенного изображения с помощью колесика прокрутки мыши и поворота с помощью клавиш со стрелками (вы также можете панорамировать мышью). Если вы приближаетесь достаточно далеко и вращаетесь, pixmap исчезнет (частично или полностью) под некоторым углом. Я еще не смог воссоздать градиенты в этом примере, но мое подозрение в том, что они являются еще одним проявлением той же проблемы.

Я попытался установить преобразование в SmoothTransformation и установить renderHint как для сглаживания, так и для HighQualityAntialiasing, но ни один из них не имел большого эффекта (сглаживание сглаживает зубы при больших масштабах). Кроме того, я попытался переместить множество флагов в рисунок QGraphicView, связанный с QGraphicsScene. Кто-нибудь знает, почему это может произойти или что я могу попытаться решить?

Я видел эту проблему как в Qt 4.8.2, так и в Qt 5.5.1, которые я загрузил 10/18/16 в качестве текущей стабильной версии Qt.

+0

Какое оригинальное изображение выглядит? – xaxxon

+0

Как бы то ни было, хотя у вас есть законная проблема, мы можем только догадываться о том, что вызывает проблему. Предоставление [MCVE] (http://stackoverflow.com/help/mcve) значительно улучшит вопрос. – TheDarkKnight

+0

Я только что разместил MCVE, он включает в себя png. – Chris

ответ

0

Похоже, что это может иметь какое-то отношение к limitation of x11. В основном, когда достигнут достаточно большой масштаб, максимальное значение будет удалено.

Я все еще не совсем уверен, почему ротация, по-видимому, влияет на вещи, но, как гипотеза, это может быть потому, что это связано с размером ограничивающего прямоугольника изображения, который будет меняться под разными углами. Градиенты, которые я видел, также нечетны, а изображение только частично исчезает, но кажется вероятным, что все они связаны, и это еще одно проявление.