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

我正尝试在包含几个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逐渐调整大小以填充窗口时,不管sizeHint()返回什么高度,它都会停止变大并开始在QTextEdit中滚动。 如果我最初有sizeHint()返回一个大的常量数,那么QTextEdit非常大,并且正如人们所期望的那样,它很好地包含在外部QScrollArea中。 但是,如果sizeHint逐渐调整QTextEdit的大小,而不是仅仅让它开始真正大,那么当它填满当前窗口并开始滚动而不是增长时,它会达到顶峰。

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

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

任何人都可以请解释一下这个? 我怀疑我对QT的布局引擎理解不够,这是因为这里。

编辑:最初发布后,我有想法重新实现maximumViewportSize()返回sizeHint()相同的东西。 不幸的是,这不起作用,因为我仍然有同样的问题。


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

  • 走上小部件层次结构并确保所有大小策略都有意义,以确保如果有任何子小部件想要成为大/小,那么父小部件将希望成为相同的东西。

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

  • 所以,故事的道理是QTextEdit代码在覆盖sizeHint时是正确的,但QScrollArea忽略了从主框架的sizeHint返回的值。

    好极了! 有用!


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

    我不明白Qt的大部分布局方案,但设置最小和最大尺寸几乎是我想要的。 好吧,无论如何,大部分时间。

    链接地址: http://www.djcxy.com/p/49669.html

    上一篇: Resizing QT's QTextEdit to Match Text Height: maximumViewportSize()

    下一篇: What's the best way to send a signal to all members of a process group?