0

我正在使用 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);} }

编辑:这是程序做什么以及为什么 QLabels 如此重要的示例图像(我的程序是左侧的窗口):

例子

4

1 回答 1

2

有两种解决方案(其中很多):

  1. 更新标签时,请禁用标签父小部件上的更新。更新完标签后重新启用更新。

  2. 使用 aQGraphicsView并在其中放置QGraphicsPixmapItems,而不是标签。

优先考虑绘制事件不会有帮助,因为它们都用于不同的小部件。如果它们都用于同一个小部件,那么您不需要做任何事情,因为事件已经合并,并且给定小部件的重绘只能存在于事件循环中。

于 2015-05-22T17:25:00.463 回答