Russian Qt Forum
Сентябрь 30, 2024, 16:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Масштабирование картинки под размер QGraphicsView, как?  (Прочитано 16488 раз)
niXman
Гость
« : Ноябрь 24, 2009, 00:59 »

Есть QGraphicsView, размером меньше размера загружаемой в него картинки.
Как масштабировать картинку под его размер?

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Ноябрь 24, 2009, 01:17 »

А как загружается картинка?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
niXman
Гость
« Ответ #2 : Ноябрь 24, 2009, 01:29 »

Цитировать
А как загружается картинка?
Код
C++ (Qt)
QPixmap pixmap0("maps/Kosovo_map-ru.svg");
QGraphicsScene scene;
scene.addPixmap(pixmap0);
ui->graphicsView->setScene(&scene);
 

Цитировать
Взгляни на QGraphicsView::fitInView(...)
Гляжу. И не догоняю как его использовать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Ноябрь 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
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
niXman
Гость
« Ответ #4 : Ноябрь 24, 2009, 04:13 »

Цитировать
можешь повесить эвент фильтр
А без этого никак?
Записан
niXman
Гость
« Ответ #5 : Ноябрь 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;
};
 

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

Как-то картинка обрезалась сверху, где-то на половину. И со сглаживанием что-то не так.
« Последнее редактирование: Ноябрь 24, 2009, 09:36 от niXman » Записан
niXman
Гость
« Ответ #6 : Ноябрь 24, 2009, 09:40 »

Эээ.. она как-то не понятно порезана/сдвинута Непонимающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Ноябрь 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);
}
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Ноябрь 24, 2009, 13:09 »

Если не получится через эвент фильр, то тогда наследуйся и переопределяй resizeEvent как я привел выше.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
niXman
Гость
« Ответ #9 : Ноябрь 24, 2009, 13:54 »

Сделал в точности как вы показали, все то же.
Событие ловиться, хз что не так. Значит сабклассить...
Записан
mal
Гость
« Ответ #10 : Ноябрь 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)
 Подмигивающий
Записан
niXman
Гость
« Ответ #11 : Ноябрь 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);
 
но вообще ничего не отображается.
Записан
niXman
Гость
« Ответ #12 : Ноябрь 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);
 

Вопрос решен.
« Последнее редактирование: Ноябрь 25, 2009, 22:41 от niXman » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.402 секунд. Запросов: 23.