Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTextCursor и подсветка текста в QPlainTextEdit
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Kroll
В QWidget засунут QPlainTextEdit с текстом внутри. ReadOnly. Так же рядом есть спинбокс с диапазоном длинны строки текста загруженного в QPlainTextEdit.

Мышью кручу спинбокс и от этого единственный символ выделенный инверсивным цветом ездит туда сюда.

Это нормальное задуманное поведение, которое реализовано соединением спинбокса с вот таким слотом в основном виджете:

void Widget::moveCursor(int pos)
{
    if(ui->plainTextEdit->toPlainText() != "")
    {
        textCursor->setCharFormat(ui->plainTextEdit->textCursor().charFormat()); //стирает выделение

        textCursor->setPosition(pos+1);
        textCursor->movePosition(QTextCursor::Left, QTextCursor::KeepAnchor);
        textCursor->setCharFormat(*charFormat); //красит выделение
    }
}


textCursor создан в конструкторе базового виджета:
textCursor = new QTextCursor(ui->plainTextEdit->document());

То есть у plainTextEdit остаётся и свой курсор отдельно.

QTextCharFormat charFormat тоже отдельный для инверсивного выделения, а родным я делаю сброс выделения на обычные цвета.


Собственно проблема:
Всё работает как задумано ровно до того момента, когда я ткну мышью в текст. И как только рабочий курсор с выделением доезжает до этой позиции, то выделение перестаёт стираться и красит всё, где побывает курсор. Если при этом ткнуть мышью в новое ещё не закрашенное место текста, то курсор с выделением начинает затирать всё после себя пока снова не дойдёт до нового места, куда я ткнул мышью и стирание опять исчезнет. Если текст весь закрасился, то нормальное поведение востановить не получается.

Каким образом не используемый мной в алгоритме подсветки родной курсор вмешивается в его работу?

Qt 4.8.4
lanz
На вскидку
ui->plainTextEdit->textCursor().charFormat()


Возвращает charFormat в позиции родного курсора. Поэтому когда выделение доезжает до этого места
то
textCursor->setCharFormat(ui->plainTextEdit->textCursor().charFormat()); //стирает выделение

не стирает выделение, а получает *charFormat.
Что из этого следует надо еще подумать. Смысл в том что charFormat не связан с курсором, это общие данные, которые используют оба курсора, отсюда и перемешивание.
Kroll
Смысл понял. После покраски поверх родного курсора родной чар формат возвращает всё время тот цвет, который на этот момент остаётся повех курсора. Получается, что вместо стирания идёт двойная покраска пока курсор находится в крашенной позиии, а как только я его в некрашенную ещё позицию передвигаю то идёт возврат цвета который там.

Странно, я думал это фиксированный чар формат по умолчанию и меняется только вручную.

Ну буду тогда хранить отдельно и умолчальный формат.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.