我在使用Qt的程序中遇到了性能问题。问题源于我每16毫秒更新一次的大量位图;更新它们大约需要300毫秒。我对此并不满意,但更大的问题是它在UI的其余部分中产生的延迟。我希望能够降低更新的优先级,以便大量的paintEvents不会阻止UI的其余部分的事件循环,但我有困难。由于update()
和repaint()
没有优先级参数,我尝试使用QCoreApplication::postEvent()
,但似乎我不允许以这种方式调用paintEvent,因为我得到了此错误消息:
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setOpacity: Painter not active
QPainter::setFont: Painter not active
QWidget::paintEngine: Should no longer be called
以下是我的问题的来源,一个240 QLabels
的数组,我每16毫秒更新一次:
if (ui->objectSlotTabs->currentIndex() == 1) {
for (int c = 0; c < 240; c++) {
QEvent* event = new QEvent(QEvent::Paint);
QCoreApplication::postEvent((*(ui->mArray))[c], event, -1);} }
编辑:这是一个示例图像,说明程序的作用以及QLabel如此重要的原因(我的程序是左边的窗口):
答案 0 :(得分:2)
有两种解决方案(在众多方面):
更新标签时,请禁用标签的父窗口小部件上的更新。完成标签更新后重新启用更新。
使用QGraphicsView
并在其中放置QGraphicsPixmapItem
,而不是标签。
优先处理绘制事件无济于事,因为它们都适用于不同的小部件。如果它们都是同一个小部件,那么您就不需要做任何事情,因为事件已经合并,并且事件循环中只能存在给定小部件的一个重绘。