1

我有一个QTextEdit包含 a 的QTextDocument,正在使用QTextCursor界面以编程方式对其进行编辑。正在使用 编辑文档QTextCursor::insertText()

QTextDocument我以块的形式加载正在编辑的文本文件,因此即使文档是 100,000 行,初始大小也可能只有 20 行。但是,我希望QTextEdit滚动条反映文档的完整大小,而不仅仅是当前显示的 20 行文档。

QTextEdit 的滚动条范围设置QScrollBar::setMaximum()为在文件初始打开时将滚动条调整为适当的大小,但在QTextCursor::insertText()调用时QScrollBar会重新计算 ' 范围。

我已经尝试QScrollBar::setMaximum()在每个QTextCursor::insertText()事件之后调用,但这只会让整个 UI 变得生涩和草率。

有什么办法可以保持修改QScrollBar时的范围QTextDocument

4

1 回答 1

0

是的。您将取决于实施细节。在QTextEditPrivate::init()中,建立了以下连接:

Q_Q(QTextEdit);
control = new QTextEditControl(q);
...
QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), q, SLOT(_q_adjustScrollbars()))

在这里,q是类型QTextEdit*,并且是指向API 对象的Q 指针。因此,您需要断开此连接,并自行管理滚动条:

bool isBaseOf(const QByteArray &className, const QMetaObject *mo) {
  while (mo) {
    if (mo->className() == className)
      return true;
    mo = mo->superClass();
  }
  return false;
}

bool setScrollbarAdjustmentsEnabled(QTextEdit *ed, bool enable) {
  QObject *control = {};
  for (auto *ctl : ed->children()) {
    if (isBaseOf("QWidgetTextControl", ctl->metaObject()) {
      Q_ASSERT(!control);
      control = ctl;
    }
  }
  if (!control)
    return false;
  if (enable)
    return QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), ed, SLOT(_q_adjustScrollbars()), Qt::UniqueConnection);
  else
    return QObject::disconnect(control, SIGNAL(documentSizeChanged(QSizeF)), ed, SLOT(_q_adjustScrollbars()));
}

希望这足以防止QTextEdit干扰您。

于 2018-07-24T15:56:19.980 回答