Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Гурман от Ноябрь 30, 2016, 21:43



Название: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Ноябрь 30, 2016, 21:43
Понадобилось менять размеры QGraphicsView так, чтобы отображались все айтемы в нём. Именно менять размеры окна, а не подгонять айтемы под окно. И мне кровь из носу надо, чтобы вид мог расти до размеров экрана. Есть вроде такая функция QGraphicsView::adjustSize(), всё работает как надо, кроме одного - с какого-то момента упирается в некое максимальное окно, которое даже меньше начального. При повторном прочтении описания обнаруживаю бредятину, которую изначально пропустил, поскольку она присутствует у QWidget, а не у самого QGraphicsView. Но QGraphicsView - это же тоже QWidget...

Цитировать
The maximum size of a window is 2/3 of the screen's width and height.

%@$#!%^@$#!!!!!..... аж дым из ушей пошёл... кто эту глупость там в Скандинавии придумал?!
От усталости (пашу с 9 утра, наваял кучу всякого) даже не могу сообразить как это обойти. Масштабировать самому руками не очень хочется - задание размеров в целых числах, а масштабирование дробное, в долях от 1. Может кто встречал, где это ограничение adjustSize() можно отключить? Я сам проверяю на размеры экрана. Если отключить - у меня будет то, что требуется.

PS причём эта скотина ограничивает не 2/3 (0.6666..), как обещано, а 0.75 по горизонтали и 0.7 по вертикали


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: ssoft от Декабрь 01, 2016, 09:12
Может переопределить методы?

Код:
virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Декабрь 01, 2016, 11:50
Может переопределить методы?

Код:
virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;
Наследовать не хочется - я в дизайнере этот вид на окне размещаю. Значит надо из-за этой ерунды полноценный плагин соорудить, а от имеющегося отказаться. Promote скорее всего не заработает, он для расширения функций плагина, переопределение методов там не описано.


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: gil9red от Декабрь 01, 2016, 12:13
Может переопределить методы?

Код:
virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;
Наследовать не хочется - я в дизайнере этот вид на окне размещаю. Значит надо из-за этой ерунды полноценный плагин соорудить, а от имеющегося отказаться. Promote скорее всего не заработает, он для расширения функций плагина, переопределение методов там не описано.

* В дизайнере можно указывать класс-наследник. Т.е. размещая просто QLabel вы указываете на его наследника и при генерации формы будет ваш класс подставляться.
* В дизайнере оставляете место под ваш виджет и в коде его добавляете


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Декабрь 01, 2016, 13:17
* В дизайнере можно указывать класс-наследник. Т.е. размещая просто QLabel вы указываете на его наследника и при генерации формы будет ваш класс подставляться.
Это promote так работает? Я им не пользовался пока. Можно попробовать.


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: gil9red от Декабрь 01, 2016, 14:30
* В дизайнере можно указывать класс-наследник. Т.е. размещая просто QLabel вы указываете на его наследника и при генерации формы будет ваш класс подставляться.
Это promote так работает? Я им не пользовался пока. Можно попробовать.

Не помню точно -- в контекстном меню виджета посмотреть :)


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Декабрь 01, 2016, 19:20
А нихрена! В коде QWidget::adjustSize()

Код:
8170        s.setWidth(qMin(s.width(), screen.width()*2/3));
8171        s.setHeight(qMin(s.height(), screen.height()*2/3));

никаких обращений к sizeHint() - нет смысла возиться с его переопределением (хотя делать promote всё равно придётся, но по другим причинам).

Во дурдом...  >:(

Остаётся только самому написать adjustSize на основе оригинала без этой глупости.


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: ssoft от Декабрь 01, 2016, 20:31
Может вместо adjustSize свой метод написать?


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Декабрь 01, 2016, 20:43
Может вместо adjustSize свой метод написать?

Ну так а это о чём?

Остаётся только самому написать adjustSize на основе оригинала без этой глупости.


Название: Re: Лимит QGraphicsView::adjustSize() в 2/3 экрана - как обойти эту глупость?
Отправлено: Гурман от Декабрь 05, 2016, 20:45
В общем, после расковыривания кода adjustSize(), стало очевидно, что эта функция легко заменяется на view->resize(view->size() * scaleFactor), где qreal scaleFactor число то же самое, которое используется для масштабирования всех видимых айтемов сцены. То есть,  
Код:
view->scale(scaleFactor);
view->resize(view->size() * scaleFactor);
масштабирует одновременно айтемы и вью, через который эти айтемы видны. То есть, делает то же самое, что adjustSize, но без странного ограничения по размеру экрана. Правда, надо заметить, что adjustSize() учитывает ещё наличие layout, но мне это не нужно. При желании можно учесть и его.

А вообще это полезно при обработке punch-жеста тач-скрина, поскольку там образуется именно нужный qreal scaleFactor.

Может ещё кому в будущем пригодится.