0

Qt を使用して作成しているプログラムでパフォーマンスの問題が発生しています。この問題は、16 ミリ秒ごとに更新する多数のビットマップに起因します。それらをすべて更新するには、約 300 ミリ秒かかります。私はこれに満足していませんが、より大きな問題は、これが UI の残りの部分で作成する遅延です。膨大な数の paintEvents が残りの UI のイベント ループをブロックしないように、更新の優先順位を下げたいと思っていますが、問題があります。update()and に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

これが私の問題の原因ですQLabels。16ミリ秒ごとに一度に更新する240の配列です。

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

(多くの中で) 2 つの解決策があります。

  1. ラベルを更新する間、ラベルの親ウィジェットの更新を無効にします。ラベルの更新が完了したら、更新を再度有効にします。

  2. ラベルの代わりにaQGraphicsViewを使用し、その中に s を配置します。QGraphicsPixmapItem

ペイント イベントはすべて異なるウィジェット用であるため、優先順位を付けても役に立ちません。それらがすべて同じウィジェット用である場合、イベントは既に結合されており、特定のウィジェットの再描画は 1 つしかイベント ループに存在できないため、何もする必要はありません。

于 2015-05-22T17:25:00.463 に答える