14

我正在尝试在包含多个 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() 相同的内容的想法。不幸的是,这不起作用,因为我仍然有同样的问题。

4

2 回答 2

11

我已经解决了这个问题。我必须做两件事才能让它工作:

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

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

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

耶!有用!

于 2010-06-19T19:13:57.783 回答
0

您可以尝试设置minimumSize的属性QTextEdit以查看是否会强制布局增长。

我不了解 Qt 的大部分布局方案,但设置最小和最大尺寸几乎可以满足我的要求。好吧,无论如何,大多数时候。

于 2010-06-16T17:05:44.483 回答