LINUX.ORG.RU

Qt прокрутка qPainter

 , ,


0

3

С-но стоит задача отрисовки карты, которая имеет достаточно большие размеры. Помимо этого стоит задача при наведении на объект менять цвет. Отрисовываю с помощью

void Dialog::paintEvent(QPaintEvent *)
{
     QPainter painter(this);
вопрос в том, как все это дело прокручивать. вроде есть QScrollArea, но там нужно указать виджет. Пробовал указать сам диалог в качестве объекта, окно вообще пропадает.

Может в qPainter есть возможность поменять центр отрисовки? Тогда с помощью скролов можно было бы менять центр отрисовки, т.е. фактически прокручивать карту.

И еще вопрос вдобавок. Про qPainter написано, что он служит для низкоуровневого вывода. Означает ли это, что этот вывод будет быстрее, чем QGraphicScene?


Открой QtAssistant и прочти документацию по QPainter.

P.S. Для тех кто в школе изучал немецкий - есть одна подсказка.

translate

trex6 ★★★★★
()

Создай отдельный виджет и в нём переопределяй paintEvent. И не забудь sizeHint и прочее.

Если карта очень большая, то лучше всё-таки в QGraphicScene, там можно OpenGL включить.

schizoid ★★★
()

Означает ли это, что этот вывод будет быстрее, чем QGraphicScene?

Нет.

void Dialog::paintEvent(QPaintEvent *)

Зачем? Сделайте свой виджет и поместите его в диалог.

вроде есть QScrollArea, но там нужно указать виджет

Про виджет, смотри выше. При создании виджета, не забудьте сделать правильные хинты.

А лучше, все-таки, используйте QGraphicsScene.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Означает ли это, что этот вывод будет быстрее, чем QGraphicScene?

Нет.

Разве в QGraphicsView все отрисовывается не через QPainter? В своих частных случаях можно тогда и быстрее рисовать через QPainter.

kamre ★★★
()
Ответ на: комментарий от kamre

Разве в QGraphicsView все отрисовывается не через QPainter?

Зависит от виджета вьюпорта, но обычно да, через QPainter.

В своих частных случаях можно тогда и быстрее рисовать через QPainter.

Если надо нарисовать одну кастомную кнопочку, да. Но у вас большая, сложная карта, а алгоритмы отрисовки скорее всего более примитивнее чем в QGraphicsView. Например, вы хотите запихать карту в QScrollArea, но при этом будете перерисовывать всю карту целиком, хотя видно будет только часть. Так ведь?

Ко всему этому вы собираетесь городить велосипеды по созданию кликабельных элементов карты. Вам за количество строк кода, что-ли, платят?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

но при этом будете перерисовывать всю карту целиком, хотя видно будет только часть. Так ведь?

С чего бы это вдруг? Будет свой оптимизированный код с индексированием данных и оптимальной перерисовкой только необходимого.

Ко всему этому вы собираетесь городить велосипеды по созданию кликабельных элементов карты. Вам за количество строк кода, что-ли, платят?

Если QGraphicsView фреймворк хорошо подходит для задачи, то его и нужно пользовать. Только утверждать что он быстрее чем своя отрисовка через QPainter (который умеет рисовать через openGL) неверно.

kamre ★★★
()
Ответ на: комментарий от kamre

Будет свой оптимизированный код

То то и оно, что будет, а QGraphicsView уже есть.

Только утверждать что он быстрее чем своя отрисовка через QPainter (который умеет рисовать через openGL) неверно

Судя по тому, что вы не осилили использовать QScrollArea у меня сильные сомнения в ваших возможностях переплюнуть авторов Qt в оптимизации отрисовки. Так понятнее?

no-such-file ★★★★★
()

Спасибо большое всем за ответы! Почитав тему, решил использовать QGraphicScene и уже наваял пример)

Остался только один вопрос, как сделать изменение цвета для элементов карты при наведении мыши? Я так понимаю, надо все элементы загнать в QList и в paintEvent обращаться к ним перебором и сравнивать координаты с координатами мыши? Или не туда копаю?

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

есть события enter/leave, а вместо сравнения координат - qQidget::underMouse()

cdshines ★★★★★
()
Ответ на: комментарий от gwyllum

Или не туда копаю?

Не туда. У QGraphicsItem есть события hoverEnterEvent и hoverLeaveEvent.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Судя по тому, что вы не осилили использовать QScrollArea у меня сильные сомнения в ваших возможностях переплюнуть авторов Qt в оптимизации отрисовки. Так понятнее?

С чего вы вообще взяли что я не осилил «использовать QScrollArea»?

kamre ★★★
()

ossnewcomer
Про раскладку.

~$ cat /etc/default/keyboard 
# Check /usr/share/doc/keyboard-configuration/README.Debian for
# documentation on what to do after having modified this file.

# The following variables describe your keyboard and can have the same
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options
# in /etc/X11/xorg.conf.

XKBMODEL="pc105"
XKBLAYOUT="us,ru"
XKBVARIANT=","
XKBOPTIONS="grp:caps_toggle,grp_led:scroll"

# If you don't want to use the XKB layout on the console, you can
# specify an alternative keymap.  Make sure it will be accessible
# before /usr is mounted.
# KMAP=/etc/console-setup/defkeymap.kmap.gz
BACKSPACE="guess"
Как вариант.

anonymous
()
Ответ на: комментарий от ossnewcomer

Так вроде православнее. Где то даже пруф видел.

anonymous
()
Ответ на: комментарий от no-such-file

«Чужой разговор» на форуме :) Просто поправил ваше не совсем корректное утверждение.

kamre ★★★
()

Свой виджет, допустим QLabel, переопределяешь QPaintEvent. В место где должны быть карта вставляешь QScrollArea, указываешь ему свой виджет.

Пример брать тут: https://github.com/RussianBruteForce/Qtnp

Смотри Qtnp и DrawCore. P. S. ACHTUNG! Использовать сей говнокод на свой страх и риск!

BruteForce ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.