Russian Qt Forum
Ноябрь 24, 2024, 23:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление фона виджета  (Прочитано 6498 раз)
developer-nsk
Гость
« : Ноябрь 02, 2009, 13:43 »

Здравствуйте, господа программисты!
Есть некая карта, которая является сценой QGraphicsScene и которая отображается посредством QGraphicsView. Этой картой юзер может управлять виджетами (QWidget), предками которых является, собственно, QGraphicsView. Виджеты рисуются на прозрачном фоне по умолчанию, всё выглядит примерно как maps.google.ru. Однако есть проблема - стоит только поменять viewport у QGraphicsView, как у виджетов управления картой перестаёт обновляться background, то есть фон перестаёт быть прозрачным и виджет тупо перерисовывыется поверх предыдущего фона. Viewport необходимо менять для включения/выключения OpenGL. Я понимаю, что с изменением viewport у виджетов тоже надо что-то поменять, чтобы они воспринимали новый viewport как фон, но что именно? Как заставить виджеты управления картой отрисовываться на прозрачном фоне после изменения viewport? Бьюсь над решением уже несколько дней, буду премного благодарен за помощь!
Записан
_OLEGator_
Гость
« Ответ #1 : Ноябрь 02, 2009, 22:35 »

Если ты создаешь виджеты на QGraphicsView (QWidget( QGraphicsView )), может надо им нового родителя установить при смене  QGraphicsView - QWidget::setParent() ?

Ну и если это так, то может проще создавать виджеты на родителе QGraphicsView? тогда и менять не придется...
« Последнее редактирование: Ноябрь 02, 2009, 22:41 от _OLEGator_ » Записан
developer-nsk
Гость
« Ответ #2 : Ноябрь 02, 2009, 22:50 »

Нет, Вы меня не совсем поняли. У виджетов управления картой parent - QGraphicsView, хотя сами являются QWidget. Создали, рисуем, всё отлично. Как только делаю команду "view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));", так сразу у этих виджетов, которые расположены на этом view, перестаёт обновляться фон... То есть была, например, линейка масштаба на прозрачном фоне и вдруг стала на чёрном, да ещё который не обновляется (то есть новое рисуется поверх старого)...
Записан
_OLEGator_
Гость
« Ответ #3 : Ноябрь 02, 2009, 23:11 »

а, смотрю что-то знакомое ( http://www.prog.org.ru/topic_10933_0.html ), решил отдельную ветку создать?
Ну тут все дело в QGLWidget... надо посмотреть возможно ли это побороть, почему бы как вариант не добавить эти виджеты в саму сцену и они поидее будут отрисовываться движком сцены на QGLWidget?
Записан
developer-nsk
Гость
« Ответ #4 : Ноябрь 03, 2009, 11:46 »

а, смотрю что-то знакомое ( http://www.prog.org.ru/topic_10933_0.html ), решил отдельную ветку создать?
Ну тут все дело в QGLWidget... надо посмотреть возможно ли это побороть, почему бы как вариант не добавить эти виджеты в саму сцену и они поидее будут отрисовываться движком сцены на QGLWidget?

Просто интересно, я пролистал больше, чем пол-форума, увидел, что несколько человек, как и я, создавали софт с географическими картами, неужели никто не сталкивался с подобной проблемой? Поэтому и решил создать новую тему, в надежде, что кто-то подскажет, как побороть эту проблему или же, быть может, предложит другое решение для виджетов управления...
К сожалению, виджеты управления никак нельзя добавить просто на сцену, хотя это было бы неплохим решением. Дело в том, что эти виджеты должны быть не подвержены преобразованиям сцены (зум, поворот, перемещение), всегда оставаться как бы "поверх" карты. Вы можете увидеть это на maps.google.ru. Добрые люди подсказали мне решение этой задачки тут: http://www.prog.org.ru/topic_10828_0.html , за что я им премного благодарен. Теперь, правда, есть другая проблема, собственно, сабж...
Записан
_OLEGator_
Гость
« Ответ #5 : Ноябрь 03, 2009, 20:30 »

я тоже занимаюсь картами, уже около 2х лет. Занимался я и 3D, как раз там возникла такая проблема, когда поместил кнопку поверх QGlWidget'а, но тогда я ее обошел поместив ее вниз окна, предварительно создав панель. Прозрачные контролы тоже ложу поверх карты, специально сегодня сделал рендеринг своей векторной карты на QGLWidget - фон действительно черный, но черный он только потому, что рисуется это поверх QGLWidget'а, и видимо так обрезается регион для рисования, хотя я рисую полностью на всю подложку.

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

Увеличения скорости рисования на QGLWidget у меня абсолютно не наблюдалось, потому что рисую все в векторе из базы данных, значительную (по сравнению с рисованием) скорость съедает выбор данных из базы. Ну если даже мне бы пришлось это сделать, я бы просто расширил ядро карты...

Поэтому напрямую эту проблему думаю не обойти... надо либо постараться вбить эти конролы в сцену (я думаю это реально, решение сразу не могу предположить из-за плохого знания этого механизма), либо писать движок самому...
Записан
_OLEGator_
Гость
« Ответ #6 : Ноябрь 05, 2009, 20:58 »

Если виджеты не имеют полупрозрачности, то можно воспользоваться установкой маски:
Код
C++ (Qt)
void QWidget::setMask ( const QBitmap & bitmap
void QWidget::setMask ( const QRegion & region )
Записан
developer-nsk
Гость
« Ответ #7 : Ноябрь 06, 2009, 18:19 »

Если виджеты не имеют полупрозрачности, то можно воспользоваться установкой маски:
Код
C++ (Qt)
void QWidget::setMask ( const QBitmap & bitmap
void QWidget::setMask ( const QRegion & region )

Спасибо большое за советы! Я обязательно попробую вышеприведённый код!
Записан
psgenn
Гость
« Ответ #8 : Январь 10, 2010, 11:22 »

Возникла такая же проблема. Что нибудь с масками получилось?
Записан
developer-nsk
Гость
« Ответ #9 : Январь 12, 2010, 17:29 »

Нет, к сожалению, вариант с масками не помог... Мне почему-то кажется, что должно быть какое-то более прозрачное и изящное решение этой проблемы...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.172 секунд. Запросов: 21.