当父尺寸更改时,如何更改子控件的尺寸?

时间:2018-09-12 14:13:21

标签: c++ qt widget

我有2个小部件,第二个小部件是第一个小部件的子级。我以为,如果您更改父窗口小部件的大小,则子窗口小部件也将更改其大小,但事实并非如此。我在互联网上搜索了问题的解决方案,但是也许在寻找解决方案时我没有正确提出问题。我没有找到解决方案,因此在这里写下。

调整父级大小后,我应该怎么做才能更改子级小部件的大小?

2 个答案:

答案 0 :(得分:1)

嗯,无布局的解决方案非常明显:在您的父级中覆盖resizeEvent方法,并驱动子级从那里调整大小。

另一方面,将子窗口小部件保留在父窗口小部件布局中将允许它自动调整其父窗口大小,但是您的问题是:如何将子窗口小部件位置设置为所选坐标?

我建议一种技术。

说您希望孩子水平移动。给父级一个QHBoxLayout布局(将布局边距和间距属性设置为0),然后向其添加子级,这样它将水平地占据整个空间。然后将QWidget添加到相同的布局,在左子级:此小部件将充当填充器。如果您希望孩子x为42,则可以使用其width方法以编程方式将填充符setFixedWidth设置为42,或者从设计者那里将其最小和最大宽度设置为42。

很明显,如果您有很多孩子,并且他们可以移动到任何地方(并且可能重叠),完全放下布局并求助于我的第一个建议,因为通常来说,布局旨在使事物相互固定,并且也许并非如此。

答案 1 :(得分:0)

原因

要自动响应其父窗口小部件的大小变化,必须将子窗口小部件添加到其布局。

解决方案

由于您不想使用自动布局,因此必须手动调整子窗口小部件的大小。为此,请在您的自定义小部件中重新实现QWidget::resizeEvent

示例

假设您有一个指向您的子小部件m_child的指针,并且此子级已被定位和调整大小,例如像这样的东西:

m_child->move(10, 20);
m_child->resize(60, 40);

resizeEvent的一种可能的实现方式是保留边距,即孩子的边缘与父母的边缘之间的距离,如下所示:

void ParentWidget::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);

    int oldWidth = event->oldSize().width();

    if (oldWidth >= 0)
        m_child->resize(m_child->width() + event->size().width() - oldWidth,
                        m_child->height() + event->size().height() - event->oldSize().height());
}

我为您准备的示例的完整代码可在GitHub上找到。

注意:示例中的QWidget::paintEvent的重新实现纯粹是出于演示目的。