Russian Qt Forum
Май 21, 2024, 07:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работает форматирование текста в QTextEdit при выделении задом-наперед.  (Прочитано 9059 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Сентябрь 07, 2008, 21:33 »

Здравствуйте!


Долго долбался над проблемой форматирования текста, а оказалось что проблема не в моем UI-коде, а в том, что я привык выделять текст задом-наперед (ну то есть двигать мышь при выделении справа-налево). В результате обнаружил следующую особенность QTextEdit в Qt 4.2.3.

Имеем поле QTextEdit, создаем кнопочки для форматирования текста в этом поле, при клике на которые выполняется такой код

Код:
void editor::on_bold_clicked(void)
{
 if(!(textarea->fontWeight()==75))
  textarea->setFontWeight(75); // Bold
 else
  textarea->setFontWeight(0); // Remove Bold
}

void editor::on_italic_clicked(void)
{
 if(!textarea->fontItalic())
  textarea->setFontItalic(true);
 else
  textarea->setFontItalic(false);
}

И если выделять текст мышкой или клавиатурой слева-направо, то кнопки работают как нужно (устанавливается и снимается форматирование). А если выделить текст справа-налево, то кнопки работают только "наполовину". То есть форматирование устанавливается, но не отменяется.

То есть проблема в том, что при выделении задом-наперед, если в выделенном тексте есть форматирование B или I, то методы fontWeight() и fontItalic() (и другие) не видят наличия форматирования.


Вопрос - как бороться с этой особенностью, желательно не меняя версии Qt либы?
Записан

Собираю информацию по крупицам
http://webhamster.ru
IMPOMEZIA
Гость
« Ответ #1 : Сентябрь 08, 2008, 00:50 »

Смотреть demos\textedit особенно на:
Код:
void QTextEdit::mergeCurrentCharFormat ( const QTextCharFormat & modifier )
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Сентябрь 08, 2008, 21:48 »

Смотреть demos\textedit особенно на:
Код:
void QTextEdit::mergeCurrentCharFormat ( const QTextCharFormat & modifier )

Предложенное там решение половинчатое, и тоже не работает как положено. Откомпилируйте его и посмотрите.

Если сделать слово жирным шрифтом, а потом начать выделять это слово сзаду-наперед, то увидим, что кнопка "B" определяет наличие форматирования (становится утопленой). Но это продолжается ровно до того момента, пока не будет выделена самая первая жирная буква слова. Как только выделяется первая буква, кнопка "B" отжимается!

И при нажатии на кнопку "B" (напомню, кнопка "B" в этот момент оказывается отжатой), вместо того чтоб жирное форматирование было снято, оно просто повторно устанавливается для этого жирного слова. А уже если еще раз нажать - то тогда форматирование снимается. Получается "холостое" нажатие кнопки форматирования.

Хотелось бы понять, как сделать применение/отмену форматирования по уму, так, чтоб все работало чотко. Как, как это сделать?


PS: Искал в гугле и у троллей готовый компонент "текстовый редактор", так чтоб базовые функции форматирования были, и все работало.. Не нашел. Существует ли такая вещь в природе?
Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Сентябрь 08, 2008, 22:31 »

Посмотрел демку demos\textedit и пришол к выводу что это пошоже на багу.

2 xintrea: Попробуйте отрепортить тролям
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
IMPOMEZIA
Гость
« Ответ #4 : Сентябрь 09, 2008, 00:08 »

Вообще-то можно сделать если дополнительно обрабатывать сигнал:
Код:
void QTextEdit::selectionChanged ()   [signal]
Оформил в виде патча для demos\textedit.
Записан
IMPOMEZIA
Гость
« Ответ #5 : Сентябрь 09, 2008, 00:21 »

хм, если выделять мышью то ничего не работает  Грустный
Похоже баг с сигналом
Код:
void QTextEdit::selectionChanged ()   [signal]
при выделении мышью, при этом сигнал
Код:
void QTextEdit::cursorPositionChanged ()   [signal]
высылается исправно.
« Последнее редактирование: Сентябрь 09, 2008, 00:29 от IMPOMEZIA » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Сентябрь 09, 2008, 11:16 »

Хм, к сожалению не могу посмотреть как ваш патч работает, ибо имею версию Qt 4.3.0, а примеры (demos) имею от 4.4.0. Бинарь, который лежал в /textedit, работает, но пересобрать его не могу. Не хватает библиотек и определений типа QPrintPreviewDialog, QT_FORWARD_DECLARE_CLASS, и т.д.
Записан

Собираю информацию по крупицам
http://webhamster.ru
IMPOMEZIA
Гость
« Ответ #7 : Сентябрь 09, 2008, 15:50 »

Теперь работает как надо, состояние кнопок обновляется при каждом изменении позиции курсора, если курсор имеет выделение и позиция курсора меньше позиции анкера (выделение справа налево), то курсор смещается на 1 вправо.
Из demos\textedit нужно выкинуть обработку сигнала:
Код:
void QTextEdit::currentCharFormatChanged ( const QTextCharFormat & f )   [signal]
а обработку сигнала:
Код:
void QTextEdit::cursorPositionChanged ()   [signal]
привести к такому виду:
Код:
void TextEdit::cursorPositionChanged()
{
    QTextCursor cursor = textEdit->textCursor();
    if (cursor.hasSelection()) {
        int position = cursor.position();
        if (position < cursor.anchor())
            cursor.setPosition(position + 1);
    }

    QTextCharFormat charFormat = cursor.charFormat();
    fontChanged(charFormat.font());
    colorChanged(charFormat.foreground().color());
    alignmentChanged(textEdit->alignment());
}

to All
Посмотрите сигнал
Код:
void QTextEdit::selectionChanged ()   [signal]
он работает правильно только при выделение при помощи клавиатуры, а с мышью проблемы, Qt 4.4.1 Windows XP
Записан
Alex03
Гость
« Ответ #8 : Сентябрь 10, 2008, 05:50 »

Поглядел как в word-е функционирует...
Там в случае выделенного текста используется не текущая позиция курсора, который кстати скрывается, а анализ текста в выделенном фрагменте. Если в выделенном фрагменте есть хоть один не жирный символ, то "экшн Ж" не "чекед".

И ИМХО это правильно - не использовать положение курсора для этих вещей когда есть выделенный текст (но используется для выделения, навигации с помощью клавиатуры.)

А вот в случае ввода символов при наличии выделенного фрагмента, вводимый текст будет соответствовать свойствам текста непосредственно перед выделением, независимо от того как это выделение производилось.

Ну а как побочный эфект (следствие компромиса) - не жирный (не италик и т.д.) текст у MS имеет некоторый приоритет над жирным (италиком и т.д.).
« Последнее редактирование: Сентябрь 10, 2008, 05:57 от Alex03 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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