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

时间:2012-05-25 16:39:17

标签: qt

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

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

2 个答案:

答案 0 :(得分:23)

布局尊重其子级sizeHint()minimalSizeHint()(而非size())。因此,您应该重新实现这两个虚拟方法并返回您想要强制的大小。每当您的尺寸提示发生变化时,您应该在自己的小部件上调用updateGeometry() ,以触发更新放置小部件的布局。

参见文档:

  
      
  • virtual QSize QWidget::sizeHint() const

         

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

  •   
  • virtual QSize QWidget::minimumSizeHint() const

         

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

  •   

因此,要强制显示小部件的最小尺寸,请通过返回最小尺寸来实施minimumSizeHint();要强制使用固定大小,请通过返回相同的大小来实现。

我还建议您阅读文档页面"Layout Management"中的以下部分:

  

布局中的自定义窗口小部件

     

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

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

只要大小提示,最小大小提示或大小策略更改,就调用QWidget :: updateGeometry()。这将导致布局重新计算。多次连续调用QWidget :: updateGeometry()只会导致一次布局重新计算。


更新(请参阅评论):

您还可以通过调用:

强制调整大小(或仅限高度/宽度)
QWidget::setFixedSize(QSize);
QWidget::setFixedHeight(int);
QWidget::setFixedWidth(int);

这些方法只是将大小提示设置为给定值,并调用updateGeometry() AFAIK。但也许他们自从做了一点点(如评论中所见),这是我在这里找到解决问题的唯一方法。

答案 1 :(得分:0)

leemes的答案给了我一些见解,我设法使用自定义SizeGrip控件实现了其他控件中布局内QTextWidget的调整大小。请注意,至少应该有一个滚动条,以便具有可见的大小抓地力​​。

有必要重新实现小部件的sizeHint()方法:

QSize MultilineTextEdit::sizeHint() const
{
    return size();
}

然后在我添加的SizeGrip小部件的mouseMoveEvent()末尾

void SizeGrip::mouseMoveEvent(QMouseEvent * e)
{
    // note that this is not the full code of the method
    ...
    // save the old minimum and maximum size of the widget (w) resized by the grip
    QSize oldMin = w->minimumSize();
    QSize oldMax = w->maximumSize();

    w->setFixedSize(nr.size()); // nr is the new rect of the widget

    w->setMinimumSize(oldMin);
    w->setMaximumSize(oldMax);
}

SizeGrip小部件受QSizeGrip类的启发,该类直接在顶级父窗口上运行。 SizeGrip改为在其直接父窗口小部件上运行。