Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Azazello от Ноябрь 01, 2018, 14:08



Название: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 01, 2018, 14:08
QGraphicsScene::sceneRect растет при добавлении итемов, что логично. Но когда очищаем сцену (clear), она не думает уменьшать размер.
Возможно ли обнулить сцену, как будто её только-что создали?

Возможно, есть другие решение этой проблемы? itemsBoundingRect()?

Солгаситесь, странное поведение класса (объекта), если мы не можем вернуть его в первоночальное состояние.


Название: Re: GraphicsScene резетнуть
Отправлено: ssoft от Ноябрь 02, 2018, 07:46
Цитировать
If unset, or if set to a null QRectF, sceneRect() will return the largest bounding rect of all items on the scene since the scene was created (i.e., a rectangle that grows when items are added to or moved in the scene, but never shrinks).

Код:
setSceneRect( QRectF() );


Название: Re: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 02, 2018, 09:24
If unset, or if set to a null QRectF, sceneRect() will return the largest bounding rect of all items on the scene since the scene was created (i.e., a rectangle that grows when items are added to or moved in the scene, but never shrinks).

Код:
setSceneRect( QRectF() );

i.e., a rectangle that grows when items are added to or moved in the scene, but never shrinks.
setSceneRect( QRectF() ); не поможет. Пробовал.


Название: Re: GraphicsScene резетнуть
Отправлено: lit-uriy от Ноябрь 02, 2018, 11:38
Если сцену нужно ужать до текущих элементов, то без изврата никак.
Ну а если на сцене элементов не осталось - прибить сцену, создать новую.


Название: Re: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 02, 2018, 12:38
Если сцену нужно ужать до текущих элементов, то без изврата никак.
Ну а если на сцене элементов не осталось - прибить сцену, создать новую.

Понятно. Спасибо.
Прибить сцену легко только когда начинаешь разработку и это придусмотрел в архитектуре, а сейчас прибивать сложновато и не хочется.

Пошел извратом
Код:

connect(this,&QGraphicsScene::changed,this,&BaScene::onChanged);

void BaScene::onChanged(const QList<QRectF> &)
{
    QRectF rect = itemsBoundingRect();
    setSceneRect(rect);
}


Название: Re: GraphicsScene резетнуть
Отправлено: lit-uriy от Ноябрь 02, 2018, 13:58
Сейчас уже не найду свой код, но такой простой, как у тебя какую-то проблему вызывал "во время эксплуатации", поэтому у меня много более сильный изврат был.
Что-то было связано с масштабированием/навигацией.


Название: Re: GraphicsScene резетнуть
Отправлено: Igors от Ноябрь 02, 2018, 16:38
Пошел извратом
2D/3D "cцена" в принципе не ограничена в пр-ве. Напр юзер хочет поставить новый объект на расстоянии 1км от имеющихся - почему нет, это совершенно корректно. Поэтому обязательно должна быть бубочка "Fit" (вписать сцену в область просмотра), но навязывать эту операцию юзеру (делать ее автоматом как у Вас) не нужно, только по запросу


Название: Re: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 05, 2018, 19:57
Пошел извратом
2D/3D "cцена" в принципе не ограничена в пр-ве. Напр юзер хочет поставить новый объект на расстоянии 1км от имеющихся - почему нет, это совершенно корректно. Поэтому обязательно должна быть бубочка "Fit" (вписать сцену в область просмотра), но навязывать эту операцию юзеру (делать ее автоматом как у Вас) не нужно, только по запросу

Ну, это смотря какая задумка у UI. Вообще немного замучался с GraphicsView.

Давайте представим задачу - колебания суточной температуры.
view это все показывает, пользователь не взаимодейтвует с GraphicsView напрямую (только в данном примере).

Но вот вы захотели посмотреть не суточные колебания, а колебания за неделю этой самой температуры. Понятно, что предыдущая сцена идет лесом и все строится заново.

Конечно, вы можете сказать, что я переборщил с GraphicsView и рисуй ручками давай в painter. В данном случае это не проблема, но при добавлении интерактивности будут сложности.


Название: Re: GraphicsScene резетнуть
Отправлено: Racheengel от Ноябрь 05, 2018, 20:04
а чем не устраивает вариант

setSceneRect( "какой-то дефолтный рект" );


Название: Re: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 05, 2018, 20:16
а чем не устраивает вариант

setSceneRect( "какой-то дефолтный рект" );

А какой дефолтный Rect. Данные то подкачиваются динамически. Сцена растет. Если я поставлю какой-то дефолтный (пусть максимальный), тогда мне прийдется каждый раз опредлять свой рект для view. Мне же нужно чтобы ползунок (scroll) показывал только существующие данные, чтобы я его передвигая мог расширять сцену. Да обычное поведению view  в модели


Название: Re: GraphicsScene резетнуть
Отправлено: Racheengel от Ноябрь 06, 2018, 19:06
А какой дефолтный Rect.

А какой тогда рект при первом создании сцены?


Название: Re: GraphicsScene резетнуть
Отправлено: Azazello от Ноябрь 06, 2018, 19:20
А какой дефолтный Rect.

А какой тогда рект при первом создании сцены?
нулевой


Название: Re: GraphicsScene резетнуть
Отправлено: Racheengel от Ноябрь 07, 2018, 18:17
Но нулевой то нельзя, зато можно 1х1, например.