Общие задачи редактирования форматированного текста
Существует ряд задач, часто выполняемых разработчиками при редактировании и обработке текстовых документов с помощью Qt. Они включают использование виджетов отображения, таких как QTextBrowser и QTextEdit, создание документов с помощью QTextDocument, редактирование с помощью QTextCursor и экспорт структуры документа. Этот документ описывает некоторые из наиболее распространенных способов использования классов форматированного текста для выполнения этих задач, демонстрируя удобные шаблоны, которые можно повторно использовать в собственных приложениях.
Использование QTextEdit
Виджет текстового редактора может быть создан и использован для отображения HTML следующим образом:
QTextEdit *editor = new QTextEdit(parent); editor->setHtml(aStringContainingHTMLtext); editor->show();
По умолчанию текстовый редактор содержит документ с корневой рамкой, внутри которой находится пустой текстовый блок. Этот документ можно получить, чтобы его можно было напрямую изменить приложением:
QTextDocument *document = editor->document();
Курсор текстового редактора также может использоваться для редактирования документа:
QTextCursor cursor = editor->textCursor();
Хотя документ можно редактировать с помощью нескольких курсоров одновременно, QTextEdit отображает только один курсор за раз. Поэтому, если мы хотим обновить редактор для отображения определенного курсора или его выделения, нам необходимо установить курсор редактора после того, как мы изменим документ:
editor->setTextCursor(cursor);
Выделение текста
Текст выделяется перемещением курсора с помощью операций, аналогичных тем, которые выполняет пользователь в текстовом редакторе. Для выделения текста между двумя точками в документе необходимо установить курсор в первую точку, а затем переместить его с помощью специального режима (QTextCursor::MoveMode) с операцией перемещения (QTextCursor::MoveOperation). При выделении текста мы оставляем якорь выделения в старой позиции курсора, как это может сделать пользователь, удерживая нажатой клавишу Shift при выделении текста:
cursor.movePosition(QTextCursor::StartOfWord);
cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);В приведенном выше коде с помощью этого метода выделяется целое слово. QTextCursor предоставляет ряд общих операций перемещения для выделения отдельных символов, слов, строк и целых блоков.
Поиск текста
QTextDocument предоставляет интерфейс на основе курсора для поиска, что упрощает поиск и изменение текста в стиле текстового редактора. Следующий код находит все вхождения определенного слова в документе и изменяет цвет каждого из них:
QTextCursor newCursor(document);
while (!newCursor.isNull() && !newCursor.atEnd()) {
newCursor = document->find(searchString, newCursor);
if (!newCursor.isNull()) {
newCursor.movePosition(QTextCursor::WordRight,
QTextCursor::KeepAnchor);
newCursor.mergeCharFormat(colorFormat);
}
}Обратите внимание, что курсор не обязательно перемещать после каждой операции поиска и замены; он всегда размещается в конце только что замененного слова.
Печать документов
QTextEdit предназначен для отображения больших документов форматированного текста, которые читаются на экране, отображая их таким же образом, как веб-браузер. В результате он не автоматически разбивает содержимое документа на страницы, подходящие для печати.
QTextDocument предоставляет функцию print() для печати документов с помощью класса QPrinter. Следующий код демонстрирует, как подготовить документ в QTextEdit для печати с помощью QPrinter:
QTextDocument *document = editor->document();
QPrinter printer;
QPrintDialog *dlg = new QPrintDialog(&printer, this);
if (dlg->exec() != QDialog::Accepted)
return;
document->print(&printer);Документ извлекается из текстового редактора, затем создается и настраивается QPrinter с помощью QPrintDialog. Если пользователь подтвердит конфигурацию принтера, документ форматируется и печатается с помощью функции print().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/richtext-common-tasks.html