0

Paintingこれは、 Qt で行われたことに関する基本的な疑問です。私は自分のアプリケーションQScrollAreaとしてを持っています。に を追加しました。のはです。このように追加すると:centralWidgetMain WindowQFrame framescrollareaLayoutQFrameQGridLayoutwidgetslayout

MainWindow::AddLabel()
{
    setUpdatesEnabled(false);
    QGridLayout *myGrid = (QGridLayout *)ui->frame->layout();
    for(int i = 0; i < 1000; i++)
    {
        QLabel *label = new QLabel();
        QString str;
        str.SetNum(i);
        label->SetText(str);
        myGrid->AddWidget(label, 0, i, 0);//add label to i'th column of row 0
    }
    setUpdatesEnabled(true);
    repaint();
}

質問の焦点では​​ないため、メモリリークについて心配しないでください。 だから私の疑問は次のとおりです。

  1. disabledウィジェットをレイアウトに追加する際に更新を設定することは役に立ちますか?

  2. ウィンドウを最大化しても、すべての QLabel が表示されるわけではありません。コード フローが上記の関数を離れてイベント ループに移動すると、すべての QLabel と QFrame の膨大な領域が描画されますか? または、表示されている QLabel のみと、表示されている QFrame のその領域のみがペイントされていますか?

4

1 に答える 1

1

フォーム (.ui) を使用している場合、内部のウィジェットはウィジェットのui ではありませんMainWindow。ええと、setUpdatesEnabled()現在のウィジェットとその子にのみ影響するため、オブジェクトui->frameはその後も更新を受け取りますmyGrid->AddWidget。への変更

  ui->frame->setUpdatesEnabled(false);
  ...
  ui->frame->setUpdatesEnabled(true);

ところで、更新を有効にすると、画面が更新されます。repaint();したがって、ウィジェットを呼び出す必要はありません。

于 2013-03-15T10:14:34.617 に答える