Почему изображения появляются в неправильных позициях в моем классе, производном от QGraphicsView? - PullRequest
0 голосов
/ 28 февраля 2011

Я создал переопределение QGraphicsView для отображения изображений внутри QMdiSubWindow в моем приложении. Позже я планирую добавить поддержку других плавающих фигур, поэтому QLabel просто не хватило. Вот базовый макет класса:

class ImageView : public QGraphicsView
{
public:
    ImageView(QWidget *parent);
    ~ImageView();

    bool clean() const
    {
        return _clean;
    }

    void showImage(const QString &path);

private:
    virtual void resizeEvent(QResizeEvent *event);

    bool _clean;
    QGraphicsScene *_scene;
    QPixmap _viewPixmap;
    QGraphicsPixmapItem *_viewPixmapItem;
};

Я хочу избежать выделения элемента QPixmap каждый раз, когда я загружаю новое изображение, поэтому я просто сохраняю его в классе, а также создаю растровый графический элемент в конструкторе следующим образом:

ImageView::ImageView(QWidget *parent) : QGraphicsView(parent), _clean(true)
{
    _scene = new QGraphicsScene(this); 
    _scene->setBackgroundBrush(Qt::lightGray);
    _viewPixmapItem = _scene->addPixmap(_viewPixmap);
    setScene(_scene);
}

Позже, когда кто-то нажимает на изображение в приложении, я вызываю (из основного класса графического интерфейса) функцию showImage:

void ImageView::showImage(const QString &path)
{
    _clean = false;
    _viewPixmap.load(path);
    _viewPixmapItem->setPixmap(_viewPixmap);
}

Моя проблема в том, что когда я в первый раз использую showImage (), изображение располагается не в левом верхнем углу вида, а скорее где-то около середины, большая часть которого находится за пределами вида, но полоса прокрутки не видна , В следующий раз, когда я пытаюсь показать изображение, я получаю событие изменения размера после вызова showImage (), изображение отображается правильно, и все последующие отображения в порядке; изображение выровнено по верхнему левому углу представления, и полосы прокрутки видны, чтобы отразить, что изображение слишком велико для вида (я планирую добавить возможность масштабирования позже). Я читаю документы снова и снова, но все больше путаюсь, не могли бы вы дать мне подсказку о том, что мне не хватает? Благодаря.

РЕДАКТИРОВАТЬ: Вот , как выглядит изображение при первом вызове showImage, а здесь - это то, как оно выглядит на последующих, то, что я хочу. Вы можете видеть, что виджет представления изображения помещается в подокно в стиле MDI внутри QMdiArea.

EDIT2: Приложение записывает информацию в файл журнала, вот часть, где я пытаюсь показать первые три изображения:

Активированное изображение в списке проектов, имя: obiekt_blisko-0000_0.bmp
ViewMdiSubWindow :: prefit: предварительная установка, новый размер: 516x352
Размер окна MDI: 516x352
Размер окна детского QWidget: 628x477
ImageView :: resizeEvent: получено событие изменения размера, старый размер был: -1x-1, новый размер: 500x313
ImageView :: showImage: Отображение изображения: D: \ praca \ dane \ pomiar3d_3 \ obiekt_blisko_L \ obiekt_blisko-0000_0.bmp
Размер после установки нового изображения: 502x315
Позиция элемента (родительские координаты): 0,0

(после этого изображение отображается некорректно)

Активированное изображение в списке проектов, имя: obiekt_blisko-0001_0.bmp
Размер окна MDI: 516x352
Размер окна детского QWidget: 502x315
ImageView :: showImage: Отображение изображения: D: \ praca \ dane \ pomiar3d_3 \ obiekt_blisko_L \ obiekt_blisko-0001_0.bmp
Размер изображения после установки нового изображения: 502x315
Позиция элемента (родительские координаты): 0,0
ImageView :: resizeEvent: получено событие изменения размера, старый размер был: 500x313, новый размер: 483x296

(теперь изображение в порядке)

Активированное изображение в списке проектов, имя: obiekt_blisko-0002_0.bmp
Размер окна MDI: 516x352
Размер окна дочернего QWidget: 502x315
ImageView :: showImage: Показ изображения: D: \ praca \ dane \ pomiar3d_3 \ obiekt_blisko_L \ obiekt_blisko-0002_0.bmp
Размер после установки нового изображения: 502x315
Позиция элемента (родительские координаты): 0,0

(Это и последующие события идентичны, и изображения в порядке)

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Причина, по которой изображение отображается в верхнем левом углу в центре вида, заключается в том, что ваша сцена имеет sceneRect из (0,0,0,0), а QGraphicsView показывает сцену по центру по умолчанию .

Установите seneRect на исправление прямоугольника, вероятно, решит вашу проблему. Вызов centerOn после смены изображения также поможет.

0 голосов
/ 28 февраля 2011

Не будет ли _viewPixmapItem-> setPos (0, 0) работать в showImage? Как вы описываете, это просто в неправильном положении. Возможно центрируется с начальным нулевым размером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...