update () или repaint () не могут вызвать paintEvent () - PullRequest
15 голосов
/ 16 февраля 2010

У меня есть QScrollArea, отцовский мой удивительный виджет прокрутки. Мне нравится делать обновления на содержание в различных случаях.

Для этого я сделал переопределение paintEvent(QPaintEvent *). Затем каждый раз, когда я хочу, чтобы это было сделано, я вызываю update() на виджете.

Проблема: paintEvent() никогда не вызывается!

Что я пробовал при устранении неполадок до сих пор:

  • Используйте repaint() вместо update(). Должен позвонить мгновенно. К сожалению, нет.
  • Тест для isVisible() и updatesEnabled
  • Проверка правильности моего переопределения. Изменение размера окна вызывает мою функцию. Сбой только моих вызовов update (), repaint ().
  • Реализуйте QTimer для запуска update () или repaint () каждые 500 мс. Триггер выдает текст, функция не вызывается.

Кто-нибудь получил идею, что проверить дальше? Что может заставить repaint () не вызывать paintEvent ()?

1 Ответ

25 голосов
/ 23 июля 2010

Решение состоит в том, чтобы вызывать this->viewport()->repaint() или this->viewport()->update() из вашего QAbstractScrollArea производного класса вместо просто repaint() или update().

Более подробная информация дана в Документация Qt :

QWidget * QAbstractScrollArea::viewport () const

Возвращает виджет видового экрана. Используйте функцию QScrollArea::widget() для извлечения содержимого виджета области просмотра.

Поскольку содержимое, которое мы имеем в нашем производном классе QAbstractScrollArea, будет отображаться в виджете видового экрана, имеет смысл вызвать обновление или перерисовку виджета видового экрана, чтобы снова нарисовать наши данные (вызвали наш paintEvent).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...