Делать масштабирование QWidget внутри QScrollArea

Я хочу показать растровое изображение на Qt и сделать возможным масштабирование, я использую QWidget внутри QScrollArea, но полосы прокрутки области не работают, когда я увеличиваю изображение, изображение становится больше, но нет полосы прокрутки, чтобы я мог двигаться, позвольте мне показать вам некоторый код:

Вот как я декларирую виджеты:

_scroll = new QScrollArea(_frame);
_image_widget = new QImageWidget(_scroll);
_scroll->setBackgroundRole(QPalette::Dark);
_scroll->setWidget(_image_widget);
_scroll->setWidgetResizable(true);

_frame — это область, где я должен показать дыру, _image_widget — это объект QImageWidget, который наследуется от QWidget

если я не использую это: _scroll->setWidgetResizable(true); изображение слишком маленькое

А вот как я справляюсь с Zoom:

 void QImageWidget::paintEvent(QPaintEvent *ev) {
QPainter p(this);
if(pixmap() != NULL){
int w = pixmap()->width();
int h = pixmap()->height();
QPixmap map = pixmap()->scaled(w*zoom,h*zoom,Qt::KeepAspectRatio);
p.drawPixmap(0, 0, map );
}
}

void QImageWidget::wheelEvent ( QWheelEvent * e )
{
int x = e->pos( ).x();
int y = e->pos( ).y();

if (e->delta() > 0)
zoom *= 2;
else
if(zoom > 1)
zoom /= 2;
}

Так что проблема в том, как я уже сказал, изображение продолжает увеличиваться, когда я увеличиваю, пока оно не займет область отверстия QScrollArea и затем, когда я продолжаю увеличивать масштаб, масштабирование работает, но полос прокрутки нет, поэтому я могу видеть другую часть изображения.

Скажи мне, если я не понятно!
Спасибо !

1

Решение

Я нашел ответ на свой вопрос, все, что мне нужно было сделать, это добавить это resize(sizeHint()*zoom); перед рисованием растрового изображения:

void QImageWidget::paintEvent(QPaintEvent *ev) {
QPainter p(this);
if(pixmap() != NULL){
int w = pixmap()->width();
int h = pixmap()->height();
QPixmap map = pixmap()->scaled(w*zoom,h*zoom,Qt::KeepAspectRatio);
resize(sizeHint()*zoom);
p.drawPixmap(0, 0, map );
}
}

пиксели были обновлены, но не размер виджета!

0

Другие решения


По вопросам рекламы [email protected]