当管理的子节点调整大小时,如何强制布局更新/调整大小?

Geo*_*rge 15 qt

我有一个自定义QTextEdit小部件,它在角落里有自己的调整大小.我可以很好地调整文本小部件的大小,但是它内部的布局不会随着文本编辑的大小调整而改变.

有没有办法告诉管理布局根据其中一个小部件的独立大小变化重新计算自己?

lee*_*mes 25

布局尊重sizeHint()minimalSizeHint()它的孩子(而不是他们size()).因此,您应该重新实现这两个虚拟方法并返回您想要强制的大小.每当您的大小提示发生变化时,您应该调用updateGeometry()自己的小部件来触发放置小部件的布局的更新.

见文档:

  • virtual QSize QWidget::sizeHint() const

    此属性包含窗口小部件的建议大小.
    [...]

  • virtual QSize QWidget::minimumSizeHint() const

    此属性包含窗口小部件的建议最小大小.
    [...]
    除非设置了minimumSize()或者将size策略设置为QSizePolicy :: Ignore,否则QLayout永远不会将窗口小部件的大小调整为小于最小大小提示的大小.如果设置了minimumSize(),则将忽略最小大小提示.

因此,要强制使用最小尺寸的窗口小部件,请minimumSizeHint()通过返回最小尺寸来实现; 以强迫固定的大小,通过返回相同的尺寸实现这两个.

我还建议阅读文档页面"布局管理"中的以下部分:

布局中的自定义小部件

在创建自己的窗口小部件类时,还应该传达其布局属性.如果小部件具有Qt的布局之一,则已经处理好了.如果窗口小部件没有任何子窗口小部件或使用手动布局,则可以使用以下任一或所有机制更改窗口小部件的行为:

  • 重新实现QWidget :: sizeHint()以返回窗口小部件的首选大小.
  • 重新实现QWidget :: minimumSizeHint()以返回窗口小部件可以具有的最小大小.
  • 调用QWidget :: setSizePolicy()以指定窗口小部件的空间要求.

每当大小提示,最小大小提示或大小策略更改时,调用QWidget :: updateGeometry().这将导致布局重新计算.对QWidget :: updateGeometry()的多次连续调用只会导致一次布局重新计算.


更新(见评论):

您还可以通过调用强制大小(或仅高度/宽度):

QWidget::setFixedSize(QSize);
QWidget::setFixedHeight(int);
QWidget::setFixedWidth(int);
Run Code Online (Sandbox Code Playgroud)

这些方法只是将大小提示设置为给定值并调用updateGeometry()AFAIK.但也许他们会做更多的事情(如评论中所见)这是我能找到解决问题的唯一方法.

  • 好吧,我使用`setFixedHeight`代替大小提示.在这种情况下,您不需要`updateGeometry`.删除大小提示的东西,并替换两行`setGeometry(x(),y(),width(),height() - h_diff);`+`size_hint_ = QSize(width(),height() - h_diff); `到简单的调用`setFixedHeight(height() - h_diff);`.另一个问题出现了:如果缩小文本区域,外部窗口小部件(在本例中为窗口)也不会收缩.你应该把整个东西放在一个小部件中,尽量减小它的大小.我希望我能帮助你.我把它添加到我的答案中. (4认同)
  • 你是一个温和的人和一个学者.谢谢.:-) http://beeroverip.org/ (2认同)