我正在尝试在包含多个 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);
这是我的问题:
随着 QTextEdit 逐渐调整大小以填充窗口,它停止变大并开始在 QTextEdit 内滚动,无论从 sizeHint() 返回什么高度。如果我最初让 sizeHint() 返回一些大的常数,那么 QTextEdit 非常大,并且很好地包含在外部 QScrollArea 中,正如人们所期望的那样。但是,如果 sizeHint 逐渐调整 QTextEdit 的大小,而不是让它开始变得非常大,那么它会在填充当前窗口并开始滚动而不是增长时达到顶峰。
我发现这个问题是,无论我的 sizeHint() 返回什么,它都不会将 QTextEdit 的大小调整为大于从 QAbstractScrollArea 继承的 maximumViewportSize() 返回的值。请注意,这与 viewport()->maximumSize() 的数字不同。我无法弄清楚如何设置该值。
查看 QT 的源代码,maximumViewportSize() 正在返回“视口的大小,就好像滚动条没有有效的滚动范围一样”。该值基本上计算为小部件的当前大小减去(2 * frameWidth + 边距)加上任何滚动条宽度/高度。这对我来说没有多大意义,我不清楚为什么该数字会以取代子类的 sizeHint() 实现的方式在任何地方使用。此外,在计算宽度和高度时使用单个“frameWidth”整数似乎很奇怪。
任何人都可以对此有所了解吗?我怀疑是我对 QT 的布局引擎理解不深造成的。
编辑:在最初发布此内容后,我有了重新实现 maximumViewportSize() 以返回与 sizeHint() 相同的内容的想法。不幸的是,这不起作用,因为我仍然有同样的问题。