0

Painting这是对Qt中完成的基本疑问。我有一个QScrollArea作为我centralWidgetMain Window应用程序。我QFrame framescrollarea. 的是。Layout_ 当我添加这样的内容时:QFrameQGridLayoutwidgetslayout

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 回答