Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alik от Август 27, 2015, 21:23



Название: Рисование больших карт в qt (чем и на чем ?)
Отправлено: alik от Август 27, 2015, 21:23
Добрый вечер!

Я пришел из Дельфи, и пытаюсь переложить один серьезный проект на кути.
Графическая модель очень серьезная отличается.
Что мне нужно выяснить сейчас - выбрать подходящий "холст" и средства рисования карт.
Карты могут менять размер при нажатии Zoom. Причем аж в 8 раз.
Размер базовой карты 800 x 800 пикселей размером 24 бит, что весит 1.83 Мб в ОЗУ.   
Соответственно максимальный холст при максимальном масштабе 8 занимает матрицу 6400 x 6400 пикселей и весит = 117.2 Мб в ОЗУ.

В дельфах я рисовал на PaintBox.Canvas с включением DoubleBuffered (чтобы не мерцало), а при необходимости сохранения карты в файл
использовал класс TImage. Так как холст размером 6400 пикселей не вмещается в экран, использовал класс TScrollBox c включением скроллов по горизонтали и вертикали. Внутрь ScrollBox помещал PaintBox.

Как и на чем мне лучше реализовать все это в QT5 ? Я имею ввиду рисовать на QWidget, QGraphicsView и т.д. Рисовать QPainter или чем то более быстрым ?


Название: Re: Рисование больших карт в qt (чем и на чем ?)
Отправлено: Igors от Август 28, 2015, 08:35
Карты могут менять размер при нажатии Zoom. Причем аж в 8 раз.
Размер базовой карты 800 x 800 пикселей размером 24 бит, что весит 1.83 Мб в ОЗУ.  
Соответственно максимальный холст при максимальном масштабе 8 занимает матрицу 6400 x 6400 пикселей и весит = 117.2 Мб в ОЗУ.
Эта логика не верна, для рисования не нужно увеличивать сам имедж, он может быть тем же 1.83 Мб. Простейший способ - вставить картинку в QScrollArea и менять размер QScrollArea::widget, но при рисовании использовать оригинал


Название: Re: Рисование больших карт в qt (чем и на чем ?)
Отправлено: Old от Август 28, 2015, 12:06
Эта логика не верна, для рисования не нужно увеличивать сам имедж, он может быть тем же 1.83 Мб. Простейший способ - вставить картинку в QScrollArea и менять размер QScrollArea::widget, но при рисовании использовать оригинал
Не имеет особого значения, кто будет масштабировать исходную картинку: разработчик руками или оставит это Qt. Можно самому масштабиовать только видимую часть картинкию


Название: Re: Рисование больших карт в qt (чем и на чем ?)
Отправлено: Fregloin от Август 28, 2015, 13:31
картинка статичная? если есть динимика или нужно выбирать мышью объекты на карте - читайте про QGraphicsView/QGraphicsScene.


Название: Re: Рисование больших карт в qt (чем и на чем ?)
Отправлено: alik от Август 28, 2015, 22:55
картинка статичная? если есть динимика или нужно выбирать мышью объекты на карте - читайте про QGraphicsView/QGraphicsScene.

Да картинку можно двигать влево-вправо и вверх-вниз с помощью мыши, на ней вибирается с помощью мыши отрезок по которому строятся в другом месте разрезы, на ней можно рисовать мышкой разные полигоны и т.д.

Правильно ли я понимаю, что QGraphicsView/QGraphicsScene более быстрые холсты для рисования ?
Можно ли в них делать скроллы по вертикали и горизонтали ?


Название: Re: Рисование больших карт в qt (чем и на чем ?)
Отправлено: Igors от Август 29, 2015, 06:09
Правильно ли я понимаю, что QGraphicsView/QGraphicsScene более быстрые холсты для рисования ?
Нет, как "холсты" (устаревший термин) они гораздо медленнее, но имеют массу вкусных плюшек для операций с примитивами (QGraphicsItem).

Можно ли в них делать скроллы по вертикали и горизонтали ?
Это делается автоматом везде. Собственно показ скроллируемой/масштабируемой картинки - час работы (если в первый раз). Долго раскачиваетесь  :)