这是对Qt中Painting
所做的基本疑问。
我的应用程序的QScrollArea
中有centralWidget
Main Window
。我在QFrame
添加了frame
scrollarea
。 Layout
的{{1}}为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();
}
是否有用?
即使我最大化窗口,并不是所有的QLabel都能被我看到。因此,当代码流离开上述功能时,进入事件循环然后是所有QLabel&amp; QFrame的巨大区域画了?或者只有那些可见的QLabel和只有那么多可见的QFrame区域?
答案 0 :(得分:1)
如果您使用的是表单(.ui),则ui
中的小部件不是小部件MainWindow
的子级 。好吧,setUpdatesEnabled()
仅影响当前窗口小部件及其子窗口,因此对象ui->frame
仍会在myGrid->AddWidget
之后收到更新。改为
ui->frame->setUpdatesEnabled(false);
...
ui->frame->setUpdatesEnabled(true);
顺便说一句,当您启用更新时,屏幕将会更新。所以你不需要在任何小部件上调用repaint();
。