Содержание статьи

QTextBrowser позволяет отображать и навигировать по тексту с расширенными возможностями, включая работу с форматированием и ссылками. Для точного управления выделением текста в нем используется класс QTextCursor, который предоставляет методы перемещения, выбора и изменения текста внутри виджета.
С помощью QTextCursor можно выделять текст по конкретным позициям, диапазонам или условиям. Методы movePosition и select позволяют задать начальную и конечную точку выделения, что особенно удобно при работе с большими объемами текста или при автоматическом форматировании.
QTextCursor поддерживает выделение слов, строк, блоков текста и всего содержимого QTextBrowser. Кроме того, он позволяет изменять формат выделенного текста, включая цвет, шрифт и стиль, без необходимости модифицировать исходный HTML или текст напрямую.
Использование программного выделения через QTextCursor упрощает реализацию функций поиска, подсветки результатов или интерактивного редактирования. При правильном применении этот инструмент обеспечивает точное управление текстом и позволяет создавать удобные пользовательские интерфейсы для работы с документами.
Создание QTextCursor для QTextBrowser

Простейший способ создания курсора:
| Код | Описание |
|---|---|
cursor = QTextCursor(text_browser.document()) |
Создает курсор для всего текста в QTextBrowser. Начальная позиция – начало документа. |
cursor = text_browser.textCursor() |
Получает текущий курсор виджета, сохраняющий позицию выделения и формат. |
cursor.movePosition(QTextCursor.Start) |
Перемещает курсор в начало документа, если нужно задать новую точку для выделения. |
После создания курсора его можно использовать для выбора текста, изменения формата и перемещения по документу. Рекомендуется сохранять исходный курсор перед изменениями, чтобы восстановить позицию пользователя после программного выделения.
Выбор текста по позиции курсора

Выделение текста в QTextBrowser начинается с установки курсора на нужную позицию. Объект QTextCursor позволяет точно указать смещение от начала документа с помощью метода setPosition(). Например,
cursor.setPosition(10)
установит курсор на 10-й символ текста.
Для выделения диапазона используется метод setPosition в сочетании с QTextCursor.KeepAnchor. Пример:
cursor.setPosition(10); cursor.setPosition(25, QTextCursor.KeepAnchor)
– выделяет текст с 10-го по 25-й символ включительно.
Важно учитывать, что позиции считаются по символам, включая пробелы и переносы строк. Для динамического выделения текста, например при поиске слов, можно вычислять позиции через textCursor().position() и методы find(), чтобы курсор автоматически переходил к нужной части документа.
С помощью этих подходов возможно точное выделение отдельных символов, слов или абзацев без изменения всего содержимого QTextBrowser, что удобно для подсветки результатов поиска или обработки пользовательского ввода.
Выделение конкретного слова или строки

Для выделения отдельного слова в QTextBrowser используется QTextCursor с методами movePosition и select. Например, чтобы выделить слово под курсором, применяется
cursor.select(QTextCursor.WordUnderCursor)
, что автоматически охватывает весь текст слова, включая пробелы вокруг.
Для выделения целой строки используют
cursor.select(QTextCursor.LineUnderCursor)
. Это позволяет захватить весь текст до конца строки, включая символ переноса строки, и применить форматирование или подсветку.
При динамическом выделении нескольких слов или строк рекомендуется сначала переместить курсор к нужной позиции через movePosition(QTextCursor.StartOfBlock) или movePosition(QTextCursor.NextWord), а затем вызвать метод select. Такой подход обеспечивает точное управление выборкой текста без затрагивания остальной части документа.
Использование этих методов позволяет создавать интерактивные функции, например, подсветку результатов поиска или выделение блоков текста при обработке пользовательских команд, без необходимости ручного подсчета символов или разборки строк.
Выделение текста через диапазон символов

QTextCursor позволяет выделять текст по точным позициям с помощью метода setPosition() и флага QTextCursor.KeepAnchor. Например, чтобы выделить текст с 5-го по 20-й символ, используют:
cursor.setPosition(5) cursor.setPosition(20, QTextCursor.KeepAnchor)
При работе с диапазонами важно учитывать, что позиции отсчитываются по всем символам, включая пробелы, переносы строк и специальные символы форматирования. Это обеспечивает точное выделение без сдвигов.
Для динамического выделения диапазонов рекомендуется вычислять позиции через методы поиска, например find(), чтобы курсор автоматически переходил к нужному тексту. Такой подход удобен для подсветки результатов поиска, обработки текстовых блоков и программного форматирования.
Можно комбинировать выделение диапазонов с методами movePosition для смещения курсора вперед или назад, что позволяет строить сложные сценарии выделения, включая несколько слов, строк или абзацев без ручного подсчета символов.
Использование методов movePosition и select
Метод movePosition позволяет перемещать QTextCursor по документу относительно текущей позиции. Он поддерживает направления NextWord, PreviousWord, StartOfBlock, EndOfBlock и другие, что позволяет точно позиционировать курсор.
Для выделения текста после перемещения используется флаг QTextCursor.KeepAnchor. Пример выделения следующего слова:
cursor.movePosition(QTextCursor.NextWord, QTextCursor.KeepAnchor)
Метод select применяет предустановленные диапазоны для выделения текста. Например,
cursor.select(QTextCursor.WordUnderCursor)
выделяет текущее слово, а
cursor.select(QTextCursor.BlockUnderCursor)
– весь блок текста.
Комбинация movePosition и select позволяет реализовать сценарии выделения с гибкой логикой: перемещение курсора к нужной позиции, выбор нужного блока и последующее форматирование или подсветка без изменения остального текста.
Для циклического выделения нескольких слов или строк можно использовать последовательные вызовы movePosition с KeepAnchor, что упрощает обработку больших текстов и динамическое выделение по условиям.
Изменение формата выделенного текста

После выделения текста в QTextBrowser с помощью QTextCursor можно изменять его формат без редактирования всего документа. Для этого используют класс QTextCharFormat и методы setCharFormat или mergeCharFormat.
Примеры форматирования:
- Изменение цвета текста:
format = QTextCharFormat() format.setForeground(QBrush(Qt.red)) cursor.mergeCharFormat(format)
- Установка жирного шрифта:
format.setFontWeight(QFont.Bold) cursor.mergeCharFormat(format)
- Изменение стиля шрифта и размера:
format.setFontFamily("Arial") format.setFontPointSize(14) cursor.mergeCharFormat(format) - Подчеркивание или курсив:
format.setFontItalic(True) format.setFontUnderline(True) cursor.mergeCharFormat(format)
Для комплексного форматирования можно создавать несколько объектов QTextCharFormat и поочередно применять их к выделенному тексту. Это позволяет подсвечивать результаты поиска, выделять ключевые слова или оформлять блоки текста без вмешательства в исходный HTML документа.
Снятие выделения текста

Для снятия выделения в QTextBrowser используют методы QTextCursor.clearSelection() или восстановление позиции курсора без флага KeepAnchor. Это позволяет вернуть текст к исходному виду без форматирования.
Примеры способов снятия выделения:
- Очистка текущего выделения:
cursor.clearSelection() text_browser.setTextCursor(cursor)
- Перемещение курсора в начало или конец документа без выделения:
cursor.movePosition(QTextCursor.Start) text_browser.setTextCursor(cursor)
- Сброс выделения после применения формата:
cursor.mergeCharFormat(QTextCharFormat())
Для сценариев с динамическим выделением рекомендуется сохранять исходный курсор и возвращать его после завершения операций, чтобы пользователь не терял текущую позицию и выделение было точно контролируемым программно.
Программное выделение текста по условию
QTextCursor позволяет автоматически выделять текст на основе заданных условий, таких как совпадение слова, наличие определенного символа или длина строки. Для этого используют методы find(), movePosition() и select().
Пример выделения всех вхождений слова «Qt»:
- Создаем курсор для документа:
cursor = QTextCursor(text_browser.document())
- Ищем первое вхождение:
if cursor.find("Qt"): - Выделяем найденный текст:
cursor.select(QTextCursor.WordUnderCursor)
- Применяем формат:
cursor.mergeCharFormat(format)
- Повторяем поиск до конца документа:
while cursor.find("Qt"):
Такой подход позволяет реализовать подсветку ключевых слов, проверку синтаксиса или фильтрацию текста. Можно комбинировать условия поиска с регулярными выражениями для сложных сценариев автоматического выделения, сохраняя при этом точность и контроль над диапазоном текста.
Вопрос-ответ:
Как создать QTextCursor для QTextBrowser и начать выделение текста?
Для создания QTextCursor используют конструктор с документом виджета:
cursor = QTextCursor(text_browser.document())
. Это создаёт курсор для всего текста. Также можно получить текущий курсор виджета через
cursor = text_browser.textCursor()
. После этого курсор можно перемещать по документу и выделять текст с помощью методов setPosition, movePosition и select.
Как выделить конкретное слово под курсором в QTextBrowser?
Для выделения слова под курсором используют метод
cursor.select(QTextCursor.WordUnderCursor)
. Если необходимо выделить несколько слов подряд, курсор предварительно перемещают к началу первого слова с помощью movePosition, а затем применяют метод select или повторный вызов movePosition с флагом KeepAnchor.
Можно ли выделять текст программно на основе условия, например, определённого слова?
Да, с помощью метода find() можно искать текст по строке или регулярному выражению. После нахождения курсор устанавливается на нужный диапазон, и выделение выполняется через select(QTextCursor.WordUnderCursor) или mergeCharFormat для применения формата. Такой подход позволяет подсвечивать все вхождения слова, строки или символа в документе автоматически.
Как выделить текст в QTextBrowser между двумя конкретными символами?
Для выделения текста между двумя позициями используют метод setPosition() с флагом QTextCursor.KeepAnchor. Сначала устанавливают курсор на начальный символ:
cursor.setPosition(start_pos)
, затем перемещают его на конечный символ с сохранением выделения:
cursor.setPosition(end_pos, QTextCursor.KeepAnchor)
. Это позволяет точно выбрать диапазон текста без изменения остального содержимого документа.
Можно ли подсветить все вхождения определённого слова в QTextBrowser?
Да, для этого используют метод find() объекта QTextCursor. Курсор ищет слово по всему документу, после чего применяют select(QTextCursor.WordUnderCursor) и задают формат через mergeCharFormat(). Цикл поиска продолжается до конца документа, что позволяет выделить все вхождения слова автоматически.
