Как мне ждать, пока QWidget :: repaint не закончится?

У меня есть графический интерфейс с 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, программа потерпит крах, если я попытаюсь.

0

Решение

Как говорит Крис, вызов update () не должен вызывать никаких проблем.

Это может помочь установить пользовательский обработчик сообщений через qInstallMsgHandler () в вашем приложении. Таким образом, вы можете получить точку останова в тот момент, когда появится предупреждение, и проверить, когда и почему это именно так и происходит.

0

Другие решения


По вопросам рекламы [email protected]