Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: niXman от Ноябрь 24, 2009, 00:59



Название: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 00:59
Есть QGraphicsView, размером меньше размера загружаемой в него картинки.
Как масштабировать картинку под его размер?



Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: pastor от Ноябрь 24, 2009, 01:17
А как загружается картинка?

Взгляни на QGraphicsView::fitInView(...)


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 01:29
Цитировать
А как загружается картинка?
Код
C++ (Qt)
QPixmap pixmap0("maps/Kosovo_map-ru.svg");
QGraphicsScene scene;
scene.addPixmap(pixmap0);
ui->graphicsView->setScene(&scene);
 

Цитировать
Взгляни на QGraphicsView::fitInView(...)
Гляжу. И не догоняю как его использовать.


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: pastor от Ноябрь 24, 2009, 03:56
В ассистенте написано :)

Код
C++ (Qt)
void Your_View::resizeEvent(QResizeEvent *event)
{
   QGraphicsView::resizeEvent(event);
 
   fitInView(m_your_scene->sceneRect(), Qt::KeepAspectRatio);
}

* можешь повесить эвент фильтр.

+ тебе нужно выставить horizontalScrollBarPolicy и verticalScrollBarPolicy в Qt::ScrollBarAlwaysOff


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 04:13
Цитировать
можешь повесить эвент фильтр
А без этого никак?


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 09:34
Сделал через эвент-фильтр.
Код
C++ (Qt)
class PaintEvent: public QObject {
Q_OBJECT
 
public:
PaintEvent(QGraphicsView* s):QObject(s),screen(s) {}
 
protected:
bool eventFilter(QObject *obj, QEvent *event) {
if ( event->type() == QEvent::Resize || event->type() == QEvent::Paint ) {
screen->fitInView(screen->rect(), Qt::KeepAspectRatio);
return true;
} else {
return QObject::eventFilter(obj, event);
}
}
 
private:
QGraphicsView* screen;
};
 

Скролбары убрал.

Как-то картинка обрезалась сверху, где-то на половину. И со сглаживанием что-то не так.


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 09:40
Эээ.. она как-то не понятно порезана/сдвинута ???


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: pastor от Ноябрь 24, 2009, 13:05
Непонятно зачем ты еще и QEvent::Paint ловишь.

Код
C++ (Qt)
bool eventFilter(QObject *obj, QEvent *event) {
if ( event->type() == QEvent::Resize ) {
screen->fitInView(screen->rect(), Qt::KeepAspectRatio);
return false;  // <-----
} else {
return QObject::eventFilter(obj, event);
}
}


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: pastor от Ноябрь 24, 2009, 13:09
Если не получится через эвент фильр, то тогда наследуйся и переопределяй resizeEvent как я привел выше.


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 24, 2009, 13:54
Сделал в точности как вы показали, все то же.
Событие ловиться, хз что не так. Значит сабклассить...


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: mal от Ноябрь 25, 2009, 21:08
1. загрузи пиксмап pixmap
2. создай QGraphicsPixmapItem
3. в него положи свой пиксмап
4. положи пиксмап айтем  на сцену scene.addItem()
5. размер сцены задай равными размеру твоему изображению scene.setSceneRect(0, 0, pixmap.size().width(), pixmap.size().height())
6. view.fitInView(pixmap_item, Qt::KeepAspectRatio)
 ;)


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 25, 2009, 21:19
Сделал:
Код
C++ (Qt)
QGraphicsView* screen;
QGraphicsScene scene;
...
...
QPixmap pixmap(file_name);
QGraphicsPixmapItem item(pixmap);
scene.addItem(&item);
scene.setSceneRect(0, 0, pixmap.size().width(), pixmap.size().height());
screen->fitInView(&item, Qt::KeepAspectRatio);
 
но вообще ничего не отображается.


Название: Re: Масштабирование картинки под размер QGraphicsView, как?
Отправлено: niXman от Ноябрь 25, 2009, 22:26
Спасибо человеку под ником mal!
Вот что требовалось:(детали опущу)
Код
C++ (Qt)
/** в конструкторе */
scene = new QGraphicsScene(NULL);
ui.graphicsView->setScene(scene);
pixmap_item = new QGraphicsPixmapItem();
scene->addItem(pixmap_item);
 
/** метод загружающий файл */
QPixmap pixmap("file_name.jpg");
pixmap_item->setVisible(true);
pixmap_item->setPixmap(pixmap);
scene->setSceneRect(0, 0, pixmap.width(), pixmap.height());
ui.graphicsView->fitInView(pixmap_item, Qt::KeepAspectRatio);
 

Вопрос решен.