У меня проблемы с производительностью программы, которую я создаю с использованием Qt. Проблема связана с большим количеством растровых изображений, которые я обновляю каждые 16 мс; для их обновления требуется около 300 мс. Я не рад этому, но большая проблема заключается в лаге, который это создает в остальной части пользовательского интерфейса. Я хотел бы иметь возможность уменьшить приоритет обновлений, чтобы огромное количество paintEvents не блокировало цикл событий для остального пользовательского интерфейса, но у меня возникли трудности. поскольку 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 так важны (Моя программа — это окно слева):
Есть два решения (среди многих):
Во время обновления ярлыков отключите обновления родительского виджета ярлыков. Повторно включите обновления, когда закончите обновлять ярлыки.
Использовать QGraphicsView
и место QGraphicsPixmapItem
внутри, вместо ярлыков.
Приоритизация событий рисования не поможет, так как они все для разных виджетов. Если бы все они были для одного и того же виджета, вам бы ничего не нужно было делать, поскольку события уже объединены, и в цикле событий может существовать только одна перекраска для данного виджета.