Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 当它管理的子布局调整大小时,如何强制布局更新/调整大小?_Qt - Fatal编程技术网

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

Qt 当它管理的子布局调整大小时,如何强制布局更新/调整大小?,qt,Qt,我有一个自定义的QTextEdit小部件,它在角落里有自己的调整大小夹点。我可以调整文本小部件的大小,但是它内部的布局不会随着文本编辑的大小而改变 有没有办法告诉管理布局根据其一个小部件中大小的独立变化重新计算自身?布局尊重其子部件的sizeHint()和minimasizehint()(而不是它们的size())。因此,您应该重新实现这两个虚拟方法,并返回要强制的大小。每当您的大小提示发生变化时,您应该调用自己的小部件上的,以触发小部件所在布局的更新 见文件: 此属性保存小部件的建议大小。

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


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

布局尊重其子部件的
sizeHint()
minimasizehint()
(而不是它们的
size()
)。因此,您应该重新实现这两个虚拟方法,并返回要强制的大小。每当您的大小提示发生变化时,您应该调用自己的小部件上的,以触发小部件所在布局的更新

见文件:

  • 此属性保存小部件的建议大小。
    [……]

  • 此属性保存小部件的建议最小大小。
    […]
    QLayout永远不会将小部件的大小调整为小于最小大小提示的大小,除非设置了minimumSize(),或者将大小策略设置为QSizePolicy::Ignore。如果设置了minimumSize(),则将忽略最小大小提示

因此,要强制小部件的最小大小,请通过返回最小大小来实现
minimumSizeHint()
;若要强制使用固定大小,请通过返回相同大小来实现这两种方法

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

版面中的自定义小部件

当您创建自己的小部件类时,还应该传递其布局属性。如果这个小部件有一个Qt的布局,这已经得到了处理。如果小部件没有任何子小部件,或使用手动布局,则可以使用以下任何或所有机制更改小部件的行为:

  • 重新实现QWidget::sizeHint()以返回小部件的首选大小
  • 重新实现QWidget::minimumSizeHint()以返回小部件可以具有的最小大小
  • 调用QWidget::setSizePolicy()以指定小部件的空间要求
每当大小提示、最小大小提示或大小策略更改时,调用QWidget::updateGeometry()。这将导致重新计算布局。多次连续调用QWidget::updateGeometry()只会导致一次布局重新计算


更新(见评论):

您还可以通过调用以下命令强制指定尺寸(或仅限高度/宽度):

QWidget::setFixedSize(QSize);
QWidget::setFixedHeight(int);
QWidget::setFixedWidth(int);

这些方法只需将大小提示设置为给定值,然后调用
updateGeometry()
AFAIK。但也许他们做得更多一些,因为(如评论中所示)这是我能找到的唯一解决问题的方法。

Leems的回答让我有了一些见解,我设法使用自定义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在其直接父窗口小部件上运行。

谢谢。我添加了这些函数,但它们似乎只有在小部件第一次构造时才被调用。当我调整布局大小时,它们不会再次被调用,即使小部件显然正在调整大小。您是否也尝试过在之后调用
updateGeometry()
?您使用的布局类型是什么?在将小部件添加到布局中时,您是否仔细检查了任何错误?在不使用调整大小夹点的情况下,您的
QTextEdit
是否会像往常一样对布局进行更改(调整父窗口小部件的大小)?好吧,这就是我正在做的。我不是Qt或其他方面的天才。我删掉了所有不相关的内容。如果我在任何地方调用updateGeometry(),我将失去调整文本编辑大小的能力。我正在进行一些测试,我猜问题在于调整大小和光标跟踪操作相互干扰。给我10分钟,我们看看是否可以解决这个问题。好的,我使用
setfixedheath
而不是大小提示来解决这个问题。在这种情况下,您不需要
updateGeometry
。移除尺寸提示内容并替换两行
setGeometry(x(),y(),width(),height()-h_diff)+
size\u hint\uqsize(宽度(),高度()-h\u差异)到简单调用
setFixedHeight(height()-h_diff)。另一个问题出现了:如果缩小文本区域,外部小部件(本例中为窗口)也不会缩小。您应该将整个内容放在一个小部件中,使其大小尽可能小。我希望我能帮助你。我把它添加到我的答案中。