crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QTextCursor и подсветка текста в QPlainTextEdit, непонятное поведение при выделении текста
Kroll
  опции профиля:
сообщение 17.11.2015, 7:24
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 7.12.2011
Пользователь №: 3049

Спасибо сказали: 0 раз(а)




Репутация:   0  


В 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 2)
lanz
  опции профиля:
сообщение 17.11.2015, 9:30
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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


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

не стирает выделение, а получает *charFormat.
Что из этого следует надо еще подумать. Смысл в том что charFormat не связан с курсором, это общие данные, которые используют оба курсора, отсюда и перемешивание.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kroll
  опции профиля:
сообщение 17.11.2015, 10:05
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 7.12.2011
Пользователь №: 3049

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

Ну буду тогда хранить отдельно и умолчальный формат.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 1:50