у меня есть QTextEdit
который содержит QTextDocument
, который программно редактируется с использованием QTextCursor
интерфейс. Документ редактируется с QTextCursor::insertText()
,
Я загружаю редактируемый текстовый файл кусками, поэтому начальный размер QTextDocument
может быть только 20 строк, даже если документ 100 000 строк. Тем не менее, я хочу QTextEdit
полоса прокрутки, чтобы отобразить полный размер документа, а не только 20-строчный документ, который он отображает в данный момент.
Диапазон полосы прокрутки QTextEdit устанавливается с QScrollBar::setMaximum()
которая корректирует полосу прокрутки до нужного размера при первом открытии файла, но когда QTextCursor::insertText()
называется QScrollBar
Диапазон пересчитывается.
Я уже пробовал звонить QScrollBar::setMaximum()
после каждого QTextCursor::insertText()
событие, но это просто делает весь интерфейс вяленым и неаккуратным.
Есть ли способ сохранить диапазон QScrollBar
в то время как QTextDocument
модифицируется?
Да. Вы бы зависели от деталей реализации. В QTextEditPrivate :: Init (), установлено следующее соединение:
Q_Q(QTextEdit);
control = new QTextEditControl(q);
...
QObject::connect(control, SIGNAL(documentSizeChanged(QSizeF)), q, SLOT(_q_adjustScrollbars()))
Вот, q
имеет тип QTextEdit*
и является Q-указатель к объекту API. Таким образом, вам нужно отключить это соединение и самостоятельно управлять полосами прокрутки:
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
от вмешательства с вами.
Я использую QT для Python, но я думаю, что подполье то же самое.
Если вы удаляете тексты клавишей возврата или клавишей удаления, вы должны пересчитать последнюю строку дна (я рекомендую выполнить эту проверку в KeyEvent).QTextCursor.movePosition(QtGui.QTextCursor.End,QtGui.QTextCursor.MoveAnchor,1)
И вы получаете курсорRect ()
textedit.verticalScrollBar()
Я не мог знать, был ли scrollBar взят из указателя textedit.verticalScrollBar () из вашего вопроса. Это немного многословно, но это может быть способом решения.