Я создал переопределение 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
(Это и последующие события идентичны, и изображения в порядке)