这是关于在Qt中完成的Painting
的基本疑问。
我的应用程序的QScrollArea
中有一个centralWidget
作为我的Main Window
。我已经在QFrame
中添加了frame
scrollarea
。 Layout
的QFrame
是QGridLayout
。
当我像这样将widgets
添加到layout
时:
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();
}
请不要担心内存泄漏,因为这不是问题的重点。
所以我的疑问是:
在添加小部件以进行布局期间将更新设置为
disabled
是否有帮助?即使将窗口最大化,我也看不到所有的QLabel。因此,当代码流离开上面的函数并转到事件循环时,是否所有QLabel和QFrame的巨大区域都被绘制了?还是仅那些可见的QLabel和仅可见的QFrame的大部分区域被涂了?
最佳答案
如果您使用的是表单(.ui),则ui
内的小部件不是小部件MainWindow
的子级。好吧,setUpdatesEnabled()
仅影响当前的小部件及其子级,因此对象ui->frame
在myGrid->AddWidget
之后仍将接收更新。改成
ui->frame->setUpdatesEnabled(false);
...
ui->frame->setUpdatesEnabled(true);
顺便说一句,当您启用更新时,屏幕将被更新。因此,您无需在任何小部件上调用
repaint();
。