Название: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: xintrea от Сентября 07, 2008, 21:33 Здравствуйте!
Долго долбался над проблемой форматирования текста, а оказалось что проблема не в моем UI-коде, а в том, что я привык выделять текст задом-наперед (ну то есть двигать мышь при выделении справа-налево). В результате обнаружил следующую особенность QTextEdit в Qt 4.2.3. Имеем поле QTextEdit, создаем кнопочки для форматирования текста в этом поле, при клике на которые выполняется такой код Код: void editor::on_bold_clicked(void) И если выделять текст мышкой или клавиатурой слева-направо, то кнопки работают как нужно (устанавливается и снимается форматирование). А если выделить текст справа-налево, то кнопки работают только "наполовину". То есть форматирование устанавливается, но не отменяется. То есть проблема в том, что при выделении задом-наперед, если в выделенном тексте есть форматирование B или I, то методы fontWeight() и fontItalic() (и другие) не видят наличия форматирования. Вопрос - как бороться с этой особенностью, желательно не меняя версии Qt либы? Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: IMPOMEZIA от Сентября 08, 2008, 00:50 Смотреть demos\textedit особенно на:
Код: void QTextEdit::mergeCurrentCharFormat ( const QTextCharFormat & modifier ) Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: xintrea от Сентября 08, 2008, 21:48 Смотреть demos\textedit особенно на: Код: void QTextEdit::mergeCurrentCharFormat ( const QTextCharFormat & modifier ) Предложенное там решение половинчатое, и тоже не работает как положено. Откомпилируйте его и посмотрите. Если сделать слово жирным шрифтом, а потом начать выделять это слово сзаду-наперед, то увидим, что кнопка "B" определяет наличие форматирования (становится утопленой). Но это продолжается ровно до того момента, пока не будет выделена самая первая жирная буква слова. Как только выделяется первая буква, кнопка "B" отжимается! И при нажатии на кнопку "B" (напомню, кнопка "B" в этот момент оказывается отжатой), вместо того чтоб жирное форматирование было снято, оно просто повторно устанавливается для этого жирного слова. А уже если еще раз нажать - то тогда форматирование снимается. Получается "холостое" нажатие кнопки форматирования. Хотелось бы понять, как сделать применение/отмену форматирования по уму, так, чтоб все работало чотко. Как, как это сделать? PS: Искал в гугле и у троллей готовый компонент "текстовый редактор", так чтоб базовые функции форматирования были, и все работало.. Не нашел. Существует ли такая вещь в природе? Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: pastor от Сентября 08, 2008, 22:31 Посмотрел демку demos\textedit и пришол к выводу что это пошоже на багу.
2 xintrea: Попробуйте отрепортить тролям Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: IMPOMEZIA от Сентября 09, 2008, 00:08 Вообще-то можно сделать если дополнительно обрабатывать сигнал:
Код: void QTextEdit::selectionChanged () [signal] Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: IMPOMEZIA от Сентября 09, 2008, 00:21 хм, если выделять мышью то ничего не работает :(
Похоже баг с сигналом Код: void QTextEdit::selectionChanged () [signal] Код: void QTextEdit::cursorPositionChanged () [signal] Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: xintrea от Сентября 09, 2008, 11:16 Хм, к сожалению не могу посмотреть как ваш патч работает, ибо имею версию Qt 4.3.0, а примеры (demos) имею от 4.4.0. Бинарь, который лежал в /textedit, работает, но пересобрать его не могу. Не хватает библиотек и определений типа QPrintPreviewDialog, QT_FORWARD_DECLARE_CLASS, и т.д.
Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: IMPOMEZIA от Сентября 09, 2008, 15:50 Теперь работает как надо, состояние кнопок обновляется при каждом изменении позиции курсора, если курсор имеет выделение и позиция курсора меньше позиции анкера (выделение справа налево), то курсор смещается на 1 вправо.
Из demos\textedit нужно выкинуть обработку сигнала: Код: void QTextEdit::currentCharFormatChanged ( const QTextCharFormat & f ) [signal] Код: void QTextEdit::cursorPositionChanged () [signal] Код: void TextEdit::cursorPositionChanged() to All Посмотрите сигнал Код: void QTextEdit::selectionChanged () [signal] Название: Re: Не работает форматирование текста в QTextEdit при выделении задом-наперед. Отправлено: Alex03 от Сентября 10, 2008, 05:50 Поглядел как в word-е функционирует...
Там в случае выделенного текста используется не текущая позиция курсора, который кстати скрывается, а анализ текста в выделенном фрагменте. Если в выделенном фрагменте есть хоть один не жирный символ, то "экшн Ж" не "чекед". И ИМХО это правильно - не использовать положение курсора для этих вещей когда есть выделенный текст (но используется для выделения, навигации с помощью клавиатуры.) А вот в случае ввода символов при наличии выделенного фрагмента, вводимый текст будет соответствовать свойствам текста непосредственно перед выделением, независимо от того как это выделение производилось. Ну а как побочный эфект (следствие компромиса) - не жирный (не италик и т.д.) текст у MS имеет некоторый приоритет над жирным (италиком и т.д.). |