Russian Qt Forum
Октябрь 17, 2017, 14:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit - выделение текста с помощью QTextCursor и функция setCharFormat()  (Прочитано 611 раз)
Rododendron
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« : Июль 10, 2017, 11:12 »

Имеется 2 функции: одна выделяет текущий найденный текст стандартным синим цветом, вторая выделяет найденный текст по всему виджету голубеньким.

В первой функции выделение текста происходит т.о.:
Код:
QTextCursor cursor=edit->textCursor();
cursor.setPosition(pos);
cursor.setPosition(pos+searched.length(),QTextCursor::KeepAnchor);
edit->setTextCursor(cursor);

Во второй функции так (я привожу часть кода, здесь это происходит в цикле по всему виджету):
Код:
cursor.setPosition(pos);
cursor.setPosition(pos+searched.length(),QTextCursor::KeepAnchor);
QTextCharFormat charFormat = cursor.charFormat();
charFormat.setBackground(QColor(150, 200, 250));
cursor.setCharFormat(charFormat);

При этом вот какую странность я обнаружил: в первом случае обязательно писать:
Код:
edit->setTextCursor(cursor);

Оно и понятно, мы получили копию QTextCursor и, чтобы его применить к QTextEdit, нам нужно вызвать эту функцию.
Но во второй функции почему-то работает без этого, когда мы вызываем setCharFormat.

Так вот. Проблема в том, что во второй функции выделение накапливается и не сбрасывается, когда меняется поисковый запрос, а в первой функции все нормально.
Пытался решить эту проблему с помощью функции clearSelection() перед циклом с выделением, но не помогло. Помогло другое. Перед циклом я выделил весь текст и задал ему фоновый цвет такой, какой был:
Код:
cursor.setPosition(0);
cursor.setPosition(edit->toPlainText().length(),QTextCursor::KeepAnchor);
QTextCharFormat charFormat = cursor.charFormat();
charFormat.setBackground(edit->palette().base());
cursor.setCharFormat(charFormat);
После этого, при изменении поискового запроса старые выделения текста удаляются, но появилась новая проблема: почему-то сбрасываются шрифты в тексте. Если эту странную операцию не делать, то шрифты не сбрасываются.
Может, это просто баги в Qt, не знаю. Версия Qt4.8.6. К сожалению проект большой мне достался, переводить его на другую версию Qt что-то не хочется.
Записан
Ilya_181
Новичок

Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #1 : Август 12, 2017, 12:34 »

QTextCursor cursor = edit->textCursor();

// выделили текст и установили выделение желтым
cursor.select(QTextCursor::Document);
edit->setStyleSheet("selection-background-color: yellow");

// в какой-то функции вернули обратно синий цвет выделения
edit->setStyleSheet("selection-background-color: blue");
Записан
Rododendron
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« Ответ #2 : Август 23, 2017, 16:35 »

А выделять как?
Проблема в том, что при выделении моим способом сбрасываются шрифты, не смотря на то, что я беру  изначально charFormat у курсора, а программа ведет себя, будто я использую дефолтный charFormat.
Задача простая: выделить несколько кусков текста в QTextEdit без потери шрифтов.
Записан
Ilya_181
Новичок

Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #3 : Сентябрь 02, 2017, 22:43 »

Посмотри пример (textedit) его можешь найти в QtCreator "примеры". Возможно тебе поможет с пропаданием шрифтов.
Например там так используется установка шрифта.

Код
C++ (Qt)
       QTextCursor cursor = edit->textCursor();
       QTextCharFormat boldFormat;
       boldFormat.setFontWeight(QFont::Bold);
       cursor.mergeCharFormat(boldFormat);
       edit->setTextCursor(cursor);
Записан
Rododendron
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« Ответ #4 : Сентябрь 04, 2017, 11:34 »

Спасибо!! Поменял setCharFormat на mergeCharFormat, и заработало как надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.071 секунд. Запросов: 23.