【发布时间】:2015-10-19 21:21:16
【问题描述】:
我有一个 QWidget,它在创建和显示后获得子小部件。它最终变得拥挤,像这样:
我试过QWidget::updateGeometry、QLayout::invalidate和QLayout::activate,但没有效果。
这是代码的概要。
void MainWindow :: show_dialog ()
{
QDialog d;
auto l = new QHBoxLayout (& d);
auto tabs = new QTabWidget ();
l -> addWidget (tabs);
auto w = new MyWidget ();
tabs -> addTab (w, tr ("..."));
d .exec ();
}
MyWidget :: MyWidget ()
{
auto l = new QGridLayout (this);
m_scroll_area = new QScrollArea ();
m_scroll_contents = new QWidget ();
m_layout = new QGridLayout (m_scroll_contents);
l -> addWidget (m_scroll_area, 0, 0, 1, 2);
for (auto i : things ())
add (i);
m_scroll_area -> setWidget (m_scroll_contents);
}
void MyWidget :: add (foo)
{
m_layout -> addWidget (x(foo), m_row);
m_layout -> addWidget (y(foo), m_row);
++m_row;
// This bit was added in an attempt to fix the problem,
// it does nothing.
for (QWidget * w = m_scroll_contents; w; w = w -> parentWidget ())
{
qWarning ("%p : %p", (void *)w, (void *)w->layout ());
w -> updateGeometry ();
if (w -> layout ())
{
w -> layout () -> invalidate ();
w -> layout () -> activate ();
}
w -> updateGeometry ();
}
}
这个想法是,稍后可以调用 MyWidget::add 来添加另一行,并且几何将重新计算,但我似乎无法解决这个问题。
有点令人惊讶的是,qWarning 行表明并非每个直到根的小部件都有布局。我不知道这是否相关。输出是这样的:
0xa60a40 : 0xa607c0 // m_scroll_contents which has QGridLayout
0x82bb70 : 0x0 // m_scroll_area I assume
0x9aec80 : 0x0 // MyWidget, I assume, but this should have a QGridLayout (!)
0xa5e9c0 : 0xa33370 // In which case this is QTabWidget
0x9b42d0 : 0x8b7800 // QDialog ?
0x9aca30 : 0x0 // ?
0x7fffd45d0950 : 0xa262a0 // ?
【问题讨论】:
-
在短暂的“调试”会话(启动 QtDesigner 并制作您的表单的简单版本)之后,我发现 UIC 会为您生成缺少的一件事:
scrollArea->setWidgetResizable(true);。可以试试吗? -
确实是假的by default