如何优先发布绘画事件?

时间:2015-05-22 16:03:16

标签: c++ windows qt paintevent

我在使用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如此重要的原因(我的程序是左边的窗口):

example

1 个答案:

答案 0 :(得分:2)

有两种解决方案(在众多方面):

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

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

  3. 优先处理绘制事件无济于事,因为它们都适用于不同的小部件。如果它们都是同一个小部件,那么您就不需要做任何事情,因为事件已经合并,并且事件循环中只能存在给定小部件的一个重绘。