【问题标题】:Why isn't this QWidget updating its geometry?为什么这个 QWidget 不更新它的几何图形?
【发布时间】:2015-10-19 21:21:16
【问题描述】:

我有一个 QWidget,它在创建和显示后获得子小部件。它最终变得拥挤,像这样:

我试过QWidget::updateGeometryQLayout::invalidateQLayout::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

标签: c++ qt


【解决方案1】:

By default, QScrollArea 不会调整它包含的小部件的大小(在您的情况下为m_scroll_contents)。您应该调用 m_scroll_area->setWidgetResizable(true); 来启用此行为。

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2013-12-27
    • 1970-01-01
    • 2017-07-24
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多