У меня есть графический интерфейс с QWidget
(в частности, QwtPlot
но я не думаю, что проблема в том, Qwt
-специфичный), который я перерисовал, используя таймер. Т.е. каждые 100 мс QWidget::update
вызывается через QwtPlot::replot
, Когда интервал таймера слишком мал, или количество выборок в QwtCurve
(QPolygonF
) слишком велика, программа вылетает, как правило, с сообщением об ошибке вроде этого:
QWidget :: repaint: обнаружена рекурсивная перекраска
QPainter :: begin: Устройство рисования может быть нарисовано только одним художником за один раз.
QPainter :: translate: Painter не активен
QPainter :: begin: Устройство рисования может быть нарисовано только одним художником за один раз.
QPainter :: save: Painter не активен
QPainter :: setClipRect: Painter не активен
QPainter :: save: Painter не активен
QPainter :: setRenderHint: Painter должен быть активным для установки подсказок рендеринга
QPainter :: setRenderHint: Painter должен быть активным для установки подсказок рендеринга
QPainter :: restore: несбалансированное сохранение / восстановление
QPainter :: save: Painter не активен
QPainter :: setRenderHint: Painter должен быть активным для установки подсказок рендеринга
QPainter :: setRenderHint: Painter должен быть активным для установки подсказок рендеринга
QPainter :: save: Painter не активен
QPainter :: setPen: Painter не активен
QPainter :: Pen: Painter не активен
QPainter :: restore: несбалансированное сохранение / восстановление
QPainter :: restore: несбалансированное сохранение / восстановление
QPainter :: save: Painter не активен …
Стандартная причина ошибки ‘recursive repaint’ заключается в том, что paint()
в update
или что-то в этом роде, но я не подкласс QWidget
так что это никогда не происходит в моем коде. Qwt
Прошло достаточно много времени, и я уверен, что в этом коде нет таких фундаментальных ошибок, как эта. Это заставляет меня думать, что update
вызывается до окончания последнего розыгрыша, что приводит меня к моему вопросу: есть ли способ узнать, завершена ли перекраска, и, таким образом, пропустить данный перерисовку, если последний не завершился в то время, когда таймер снова загорается?
Редактировать: я использую таймер, потому что вычисления, которые генерируют данные для рисования, выполняются в рабочем потоке. Я использую Qt::BlockingQueuedConnection
для этого сигнала и гарантии с assert()
этот реплот вызывается только из основного потока. Вот почему я не использую функцию автоматического повторного QwtPlot
, программа потерпит крах, если я попытаюсь.
Как говорит Крис, вызов update () не должен вызывать никаких проблем.
Это может помочь установить пользовательский обработчик сообщений через qInstallMsgHandler () в вашем приложении. Таким образом, вы можете получить точку останова в тот момент, когда появится предупреждение, и проверить, когда и почему это именно так и происходит.