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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
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 не связан с курсором, это общие данные, которые используют оба курсора, отсюда и перемешивание.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 2.3.2021, 8:21