我有一个包含QTextDocument的QTextEdit,它正在使用QTextCursor接口进行编程编辑。该文档正在使用QTextCursor::insertText()进行编辑。
我以块的形式加载正在编辑的文本文件,所以即使文档有100,000行,QTextDocument的初始大小也可能只有20行。但是,我希望QTextEdit滚动条反映文档的完整大小,而不仅仅是它当前显示的20行文档。
QTextEdit的滚动条范围是用QScrollBar::setMaximum()设置的,它会在文件的初始打开时将滚动条调整到适当的大小,但当调用QTextCursor::insertText()时,QScrollBar的范围会重新计算。
我已经尝试在每个QTextCursor::insertText()事件之后调用QScrollBar::setMaximum(),但这只会使整个UI变得粗糙和凌乱。
有没有办法在修改QTextDocument时保持QScrollBar的范围?
发布于 2018-07-24 23:56:20
是。您将依赖于实现细节。在QTextEditPrivate::init()中,将建立以下连接:
Q_Q(QTextEdit);
control = new QTextEditControl(q);
...
QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), q, SLOT(_q_adjustScrollbars()))这里,API的类型是QTextEdit*,是q对象的Q-pointer。因此,您需要断开此连接,并自行管理滚动条:
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干扰您。
https://stackoverflow.com/questions/51500059
复制相似问题