Russian Qt Forum

Qt => Вопросы новичков => Тема начата: bez_glaz от Март 05, 2012, 12:54



Название: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 05, 2012, 12:54
Добрый день.
Нужен совет, как более правильно cделать или может есть стандартный способ.
Использую такой код
Код:
    
    QGraphicsScene * scen = new QGraphicsScene();
    QPixmap * pix = new QPixmap();
    pix->load("qqq.png");
    scen->addPixmap(*pix);
    ui->Mnemo->setScene(scen);
    //Mnemo - компонент QGraphicsView
Всё корректно без ошибок, но когда начинаю "играться" с окном формы, изображение сохраняет свой прежний размер, только появляются ScrollBar'ы. Надо чтоб изображение под виджет подстраивалось.
А вот с чем работать даже теряюсь, с  QGraphicsScene, QPixmap или QGraphicsView?
С чем будит легче или корректнее работать в этом направлении ?


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 05, 2012, 13:14
Эм. Сокращая до пары предложений:

"У меня есть картинка, я её добавил. А она, гадкая, не ресайзится сама."

Ответ: нужно самому ресайзить, или доверить работу своему классу.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 05, 2012, 13:18
Просьба читать внимательнее посты. Если раздел форума "для новичков" не надо на отмаш бомбить ответы.
Уточняю свой вопрос - к какому классу(QGraphicsScene, QPixmap или QGraphicsView) будит лучше применять те или иные действия, что бы был "автосайз" по виджету.
Под словом "лучше" я понимаю какие-нибудь классические решения.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 05, 2012, 13:21
Хм. А я не наотмаш бомблю однако. Я читаю и анализирую.

Куда вам эту картинку надо? Что над виджетом будет? Что представляет собой ваш виджет?

Самый простой вариант QPixmap на задний фон и усё.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 05, 2012, 13:27
Хм. А я не наотмаш бомблю однако. Я читаю и анализирую.

Куда вам эту картинку надо? Что над виджетом будет? Что представляет собой ваш виджет?

Самый простой вариант QPixmap на задний фон и усё.
Всё до примитива просто - форма с виджетом  QGraphicsView, вывод картинки я описал в первом посте. Надо чтоб изображение растягивалось или сжималось, по изменению формы. Что значит
Цитировать
Самый простой вариант QPixmap на задний фон и усё.
вообще не понял. Background обеспечивает автоматическое сжатие\растягивание ?


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 05, 2012, 13:34
Нет. Скорее всего в Qt нет виджета с функцией "авторастягивания".

Потому самым простым, видимым мне вариантом, является QPixmap, автоматически изменяемый при каждом ресайзе виджета.

Если же у вас уже используется QGraphicsView, то возможно есть элемент с таким функционалом, который можно будет поместить на него. Но при этом придётся перехватывать/или не обрабатывать все события, связанные с вашим задником.



Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: GreatSnake от Март 05, 2012, 13:46
Потому самым простым, видимым мне вариантом, является QPixmap, автоматически изменяемый при каждом ресайзе виджета.
Может и простой, но самый отвратительный.

Надо чтоб изображение под виджет подстраивалось.
См. здесь (http://www.prog.org.ru/index.php?topic=15459.msg102220#msg102220) или здесь (http://www.prog.org.ru/index.php?topic=14327.msg93509#msg93509).


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 05, 2012, 13:50
Ну. Отвратительный не отвратительный, но костыль.

Да, про painter я чтот даж не подумал, хотя одно и то же ;)


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: BRE от Март 05, 2012, 13:57
2bez_glaz Ты хочешь, что бы сцена все время масштабировалась под размер виджета? При увеличении окна - увеличивались и объекты сцены?


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: GreatSnake от Март 05, 2012, 13:59
Ну. Отвратительный не отвратительный, но костыль.

Да, про painter я чтот даж не подумал, хотя одно и то же ;)
Совсем не одно и тоже!
При изменении размера виджета нужно будет пере-создавать пиксмап, который является довольно-таки тяжелым ресурсом и хранится на стороне Х-сервера или GDI (omg - сколько же раз я это уже говорил здесь). Насколько это оптимально - выводы делай сам.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 06, 2012, 08:21
2bez_glaz Ты хочешь, что бы сцена все время масштабировалась под размер виджета? При увеличении окна - увеличивались и объекты сцены?

Да именно так.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 06, 2012, 08:29
ппц...
вначале - картинку на фоне хочу с маштабированием.
конец - хочу чтоб все объекты на сцене пропорционально масштабировались.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 06, 2012, 08:30
ппц...
вначале - картинку на фоне хочу с маштабированием.
конец - хочу чтоб все объекты на сцене пропорционально масштабировались.
Картинку на фоне???
А ну давай укажи мне, где я это писал ?????


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: BRE от Март 06, 2012, 08:45
Да именно так.
У QGraphicsView есть метод fitInView, его можно вызывать из обработчика resizeEvent.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 06, 2012, 08:54
Цитировать
Уточняю свой вопрос - к какому классу(QGraphicsScene, QPixmap или QGraphicsView) будит лучше применять те или иные действия, что бы был "автосайз" по виджету.

Во всяком случае про "ресайз всех элементов на сцене" по этой реплике можно только догадаться. ;)


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 06, 2012, 08:58
Цитировать
Уточняю свой вопрос - к какому классу(QGraphicsScene, QPixmap или QGraphicsView) будит лучше применять те или иные действия, что бы был "автосайз" по виджету.

Во всяком случае про "ресайз всех элементов на сцене" по этой реплике можно только догадаться. ;)
ресайз всех элементов на сцене - это моя конечная цель.
А пока у меня 1 элемент и я не могу его даже растянуть по всей форме, при первоначальном запуске программы. Элемент остаётся статичным, при любых изменениях формы (соответственно и изменения виджета QGraphicsView), будь то растяжение или сжатие. В последнем скролы добавляются в виджет.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: BRE от Март 06, 2012, 09:17
А вот с чем работать даже теряюсь, с  QGraphicsScene, QPixmap или QGraphicsView?
У тебя есть два варианта: настроить матрицу view или настроить матрицу scene.
Какой вариант выбрать решать тебе.
С помощью fitInView легко настраивается матрица view, но не намного сложнее самому скалить сцену, что бы она полностью помещалась в view.
Разница будет в том, какую матрицу использовать для обратного преобразования, если понадобиться.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 06, 2012, 10:03
Да именно так.
У QGraphicsView есть метод fitInView, его можно вызывать из обработчика resizeEvent.

Так первоначальная цель выполнилась всё адекватно авто-скалитя по растяжке/сжатию формы.
Код:
void MainWindow::resizeEvent(QResizeEvent *event)
{
    QRectF rec = scen->sceneRect();
    ui->Mnemo->fitInView(rec,Qt::IgnoreAspectRatio);
}
Теперь следующий вопрос подгружал в сцену изображение следующем методом
Код:
    pix = new QPixmap();
    pix->load("qqq.png");
    scen->addPixmap(*pix);
И как я начитал маны с данной подгрузкой я никак вообще не могу управлял элементом в сцене (задать его начальные координаты и т.д.)
Передо мной стоит задача - добавить в сцену ещё один элемент - то же картинку, но у неё будит определённая область, и определённые начальные координаты относительно сцены.
немного почитав ещё манов я понял, что мне надо сначала создать на сцене объект типа -
Код:
QGraphicsRectItem * QGraphicsScene::addRect ( const QRectF & rect, const QPen & pen = QPen(), const QBrush & brush = QBrush() ) 
А перед этим в параметре brush сделать следующее
Код:
QBrush brush(QColor(255, 255, 255), QPixmap(“qqq2.jpg”));
а в параметре pen
Код:
QPen pen(Qt::NoPen);
и потом уже с Rect манипуляции проводить.
Подход который я описал приемлемый ? Или есть что-то получше ?


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: GreatSnake от Март 06, 2012, 10:41
Подход который я описал приемлемый ? Или есть что-то получше ?
Тебе же была дана ссылка (http://www.prog.org.ru/index.php?topic=14327.msg93509#msg93509) на самый оптимальный вариант.
Зачем нужно изобретать велосипед ???


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: Bepec от Март 06, 2012, 10:56
Таки ему нужен не "ресайз фона", а "ресайз всех элементов пропорционально размера сцены".

Как ты мог не догадаться? он говорит это очевидно ;)


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: bez_glaz от Март 06, 2012, 11:35
Подход который я описал приемлемый ? Или есть что-то получше ?
Тебе же была дана ссылка (http://www.prog.org.ru/index.php?topic=14327.msg93509#msg93509) на самый оптимальный вариант.
Зачем нужно изобретать велосипед ???
Как я понял данная ссылка предназначена для перегрузки определённой функции -> ресайз заднего фона, который является пиксмапом.
Я не даром создал тему в разделе "Для новичков". Графику тока начал изучать на Qt. К QPixmap вообще пока не прикасался, а в примере всё около него крутится, если не ошибаюсь.  :(
У меня всё получилось и без QPixmap. И хотелось бы и дальше обойтись без него, вплоть до достижения конечной цели. Мне кажется это реально. Хочу понять весь механизм работы именно того пути по которому пошёл я.


Название: Re: QGraphicsView - вывести изображение под виджет
Отправлено: GreatSnake от Март 06, 2012, 11:39
Как я понял данная ссылка предназначена для перегрузки определённой функции -> ресайз заднего фона, который является пиксмапом.
Я не даром создал тему в разделе "Для новичков". Графику тока начал изучать на Qt. К QPixmap вообще пока не прикасался, а в примере всё около него крутится, если не ошибаюсь.  :(
Ошибаешься. Смотри внимательно код. Там как раз всё под QImage заточено.