首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止QTextCursor::insertText()修改QTextDocument滚动条范围

停止QTextCursor::insertText()修改QTextDocument滚动条范围
EN

Stack Overflow用户
提问于 2018-07-24 21:36:37
回答 1查看 229关注 0票数 1

我有一个包含QTextDocumentQTextEdit,它正在使用QTextCursor接口进行编程编辑。该文档正在使用QTextCursor::insertText()进行编辑。

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

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

我已经尝试在每个QTextCursor::insertText()事件之后调用QScrollBar::setMaximum(),但这只会使整个UI变得粗糙和凌乱。

有没有办法在修改QTextDocument时保持QScrollBar的范围?

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 23:56:20

是。您将依赖于实现细节。在QTextEditPrivate::init()中,将建立以下连接:

代码语言:javascript
复制
Q_Q(QTextEdit);
control = new QTextEditControl(q);
...
QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), q, SLOT(_q_adjustScrollbars()))

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

代码语言:javascript
复制
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干扰您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51500059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档