Spec-Zone.ru › Qt 5.9

Общие задачи редактирования форматированного текста

Разработчики часто выполняют ряд задач при редактировании и обработке текстовых документов с использованием 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.6/richtext-common-tasks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API