События обновления QWidget, но без визуального обновления
Использование Qt4.8 на Mint Linux 12 я реализовал простое окно, содержащее QTableView
для отображения содержимого модели. Данные модели постоянно обновляются (сообщения журнала) и dataChanged()
сигнал испускается на регулярной основе (т. е. каждые 100 мс).
проблема, которую я вижу, - это заикание визуальных обновлений на столе.
я установил фильтр событий в окне, которое считает updateRequest
- введите события, которые должны вызвать перекраску виджета (также на дочерних виджетах, т. е. tableView
). Они приходят со средним временем ~170ms между ними и стандартным отклонением ~90ms (что довольно велико, я думаю). Однако воспринимаемая скорость визуального обновления составляет всего два или три раза в секунду, и мне интересно, почему. Кажется, что не все updateRequest
события вызывают перекраску виджета или то, что оконная система глотает визуальные обновления.
в качестве второго теста я заставил окно обновить себя, вызвав repaint
или update
каждые 100 мс. Использование repaint
, Я видел соответствующее увеличение updateRequest
- тип событий и уменьшение стандартного отклонения зазоров; с update
, число не увеличилось. Однако в обоих случаях наблюдалось лишь умеренное увеличение предполагаемой скорости обновления.
также: есть ли хороший метод для измерения того, как часто виджет на самом деле перекрашивается без перегрузки его paintEvent
обработчик? Может быть, что-то из QTest
?
обновление: я продлил свое событие фильтр также поймать paintEvent
-тип события. Есть только однозначное число тех, против > 1000 updateRequest
-тип события.
2 ответов
вы должны инструмент диспетчера событий aboutToBlock()
и awake()
сигналы и измеряют время между ними, используя QElapsedTimer
. Экземпляр диспетчера событий для текущего потока возвращается статическим QAbstractEventDispatcher::instance()
.
если цикл событий спит для очень небольшой части вашего окна измерения времени, это означает, что в потоке GUI происходит слишком много вещей. Вы можете подсчитать, как долго цикл событий спал, скажем, в течение последней секунды. Если это ниже 10%, вы можно ожидать медленных обновлений и еще много чего. Помните, что события обновления находятся в очереди с Qt::LowEventPriority
. Они будут опережать стандартные сигналы в очереди и почти все другие события.
QApplication::compressEvent
выкладывает QEvent::UpdateRequest
, если уже есть один необработанный. Таким образом, даже перекраска может немедленно вернуться без покраски, Если событие отброшено. Вы можете проверить, если ваш updateRequest
события отбрасываются перезаписью compressEvent
.