gpt4 book ai didi

qt - 调整QT的QTextEdit大小以匹配文本高度: maximumViewportSize()

转载 作者:行者123 更新时间:2023-12-03 06:37:14 26 4
gpt4 key购买 nike

我正在尝试在包含多个 QT 小部件的表单中使用 QTextEdit 小部件。表单本身位于 QScrollArea 内,它是窗口的中央小部件。我的意图是,任何必要的滚动都将发生在主 QScrollArea 中(而不是在任何小部件内),并且内部的任何小部件将自动调整其高度以容纳其内容。

我尝试使用 QTextEdit 实现高度的自动调整,但遇到了一个奇怪的问题。我创建了 QTextEdit 的子类并重新实现了 sizeHint(),如下所示:

QSize OperationEditor::sizeHint() const {
QSize sizehint = QTextBrowser::sizeHint();
sizehint.setHeight(this->fitted_height);
return sizehint;
}

this->fitted_height 通过连接到 QTextEdit 的“contentsChanged()”信号的槽保持最新:

void OperationEditor::fitHeightToDocument() {
this->document()->setTextWidth(this->viewport()->width());
QSize document_size(this->document()->size().toSize());
this->fitted_height = document_size.height();
this->updateGeometry();
}

QTextEdit子类的大小策略是:

this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);

我在阅读 this post. 后采取了这种方法

这是我的问题:

当 QTextEdit 逐渐调整大小以填充窗口时,无论 sizeHint() 返回什么高度,它都会停止变大并开始在 QTextEdit 内滚动。如果我最初让 sizeHint() 返回一些大的常量,那么 QTextEdit 就会非常大,并且正如人们所期望的那样,很好地包含在外部 QScrollArea 中。然而,如果 sizeHint 逐渐调整 QTextEdit 的大小,而不是一开始就让它变得很大,那么当它填满当前窗口并开始滚动而不是增长时,它就会达到顶峰。

我发现这个问题是,无论我的 sizeHint() 返回什么,它都不会将 QTextEdit 的大小调整为大于从 MaximumViewportSize() 返回的值,该值是从 QAbstractScrollArea 继承的。请注意,这与 viewport()->maximumSize() 不同。我无法弄清楚如何设置该值。

查看 QT 的源代码,maximumViewportSize() 返回“视口(viewport)的大小,就好像滚动条没有有效的滚动范围一样”。该值基本上计算为小部件的当前大小减去(2 * 框架宽度 + 边距)加上任何滚动条宽度/高度。这对我来说没有多大意义,并且我不清楚为什么该数字会在任何地方以取代子类的 sizeHint() 实现的方式使用。另外,在计算宽度和高度时使用单个“frameWidth”整数似乎很奇怪。

有人可以解释一下吗?我怀疑我对 QT 布局引擎的理解不佳是罪魁祸首。

编辑:最初发布此内容后,我有想法重新实现 MaximumViewportSize() 以返回与 sizeHint() 相同的内容。不幸的是,这不起作用,因为我仍然遇到同样的问题。

最佳答案

我已经解决了这个问题。为了让它发挥作用,我必须做两件事:

  1. 沿着小部件层次结构向上走,确保所有大小策略都有意义,以确保如果任何子小部件想要变大/变小,那么父小部件也希望是相同的东西。

  2. 这是修复的主要来源。事实证明,由于 QTextEdit 位于 QScrollArea 中主要小部件的 QFrame 内,因此 QScrollArea 有一个约束,即除非“widgetResizable”属性为 true,否则它不会调整内部小部件的大小。相关文档位于:http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop 。直到我尝试了这个设置并让它发挥作用之前,我并不清楚该文档。从文档来看,这个属性似乎只处理主滚动区域想要调整小部件大小的时间(即从父级到子级)。它实际上意味着,如果滚动区域中的主小部件想要调整大小(即子级到父级),则必须将此设置设置为 true。

所以,这个故事的寓意是,QTextEdit 代码在覆盖 sizeHint 方面是正确的,但 QScrollArea 忽略了从主框架的 sizeHint 返回的值。

耶!它有效!

关于qt - 调整QT的QTextEdit大小以匹配文本高度: maximumViewportSize(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com