Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: paintEvent in Qt5  (Прочитано 1705 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
paintEvent in Qt5
« : 10 Декабря 2014, 21:13:27 »
Здравствуйте!

После переноса программы с Qt4 на Qt5 в ней перестал вызываться paintEvent во внутреннем виджете.
Я попробую описать ситуацию словами, как общий случай.
Именно, кроме главного виджета, наследующего QMainWindow, есть ещё программный модуль с классом,
наследующим QWidget, в котором есть свой paintEvent. В нём отрисовываются jpg по мере их готовности.
В главном виджете создаётся экземпляр этого класса с указанием себя как родительского, т.е. this.
Дальше все как обычно, в paintEvent он функцией show выводится на экран, а картинки в нём
меняются в этом экземпляре в его paintEvent и оказываются на экране без участия главного виджета. Флаги для внутреннего виджета установлены какие надо.

После переноса программы на Qt5 это перестало работать. Как оказалось, в этом экземпляре
перестал вызываться его paintEvent по сигналу update, но всё остальное работает.
Место на экране для этого виджета остаётся чёрным.
Если создавать экземпляр этого класса без родительского, то paintEvent вызывается, место на экране
затирается функцией erase во внутреннем paintEvent, но картинки не появляются, хотя то место во
внутреннем painEvent, где они выводятся функцией drawImage, проходится.

М.б., кто-нибудь знает, как это делается в Qt5? У меня пока не получается.
Пётр.

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: paintEvent in Qt5
« Ответ #1 : 11 Декабря 2014, 09:51:11 »
http://qt-project.org/doc/qt-5/qwidget.html#custom-widgets-and-painting
Там вроде бы есть ссылки на примеры.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
Re: paintEvent in Qt5
« Ответ #2 : 11 Декабря 2014, 10:49:35 »
Благодарю, попробую посмотреть.
У меня, если при создании экземпляра виджета указать родительский,
то даже с repaint() вместо update() paintEvent() не вызывается.
А если родительский виджет не указывать, то вызывается, но в paintEvent()
для QPainter p; вызов p.begin(this) заканчивается неудачно.
Как сказано в справке, это указывает на серьёзные проблемы.

Пользователь решил продолжить мысль [time]11 Декабрь 2014, 13:14:20[/time]:
Пока ничего не получается. В этом виджете не выполняется p.begin(this), несмотря на все эксперименты,
в т.ч. если определить в нём paintEvent() как обычную функцию, без параметров и вместо repaint() вызывать
его явно. Что-то не в порядке в программе в целом, поэтому, наверное, и paintEvent() не вызывается
системой, если виджет создан как имеющий родителя.


Пользователь решил продолжить мысль 11 Декабря 2014, 13:41:45:
Пока обнаружил, что, если вместо tnis в виджете рисовать в QPixmap px;
то тогда и update() работает, т.е. paintEvent() вызывается и QPainter p; p.begin(px);
выполняется и тогда, когда виджет создаётся с родителем. Чем-то системе не нравится
собственный this виджета.
« Последнее редактирование: 11 Декабря 2014, 13:41:45 от Peter_I »
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3270
    • Просмотр профиля
Re: paintEvent in Qt5
« Ответ #3 : 16 Декабря 2014, 12:35:20 »
http://qt-project.org/doc/qt-5/qwidget.html#custom-widgets-and-painting
Там вроде бы есть ссылки на примеры.
Там я ответа не нашёл, а оказалось, что в дочернем виджете нельзя было устанавливать атрибут WA_PaintOnScreen.
Возможно, что система воспринимает это как попытку рисовать в this главного виджета, что запрещено.
Также потребовалось установить атрибут WA_OpaquePaintEvent, он устраняет мелькание.
Пётр.

 

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