crossplatform.ru

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


  Ответ в QTextCursor и подсветка текста в QPlainTextEdit
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Kroll Дата 17.11.2015, 10:05
  Смысл понял. После покраски поверх родного курсора родной чар формат возвращает всё время тот цвет, который на этот момент остаётся повех курсора. Получается, что вместо стирания идёт двойная покраска пока курсор находится в крашенной позиии, а как только я его в некрашенную ещё позицию передвигаю то идёт возврат цвета который там.

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

Ну буду тогда хранить отдельно и умолчальный формат.
lanz Дата 17.11.2015, 9:30
  На вскидку
ui->plainTextEdit->textCursor().charFormat()


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

не стирает выделение, а получает *charFormat.
Что из этого следует надо еще подумать. Смысл в том что charFormat не связан с курсором, это общие данные, которые используют оба курсора, отсюда и перемешивание.
Kroll Дата 17.11.2015, 7:24
  В 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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 26.2.2021, 4:46