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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не меняется формат символов в selection в QPlainTextEdit  (Прочитано 2690 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июль 19, 2011, 18:59 »

Надо подчеркнуть одно слово в тексте, поэтому решил не мучать syntax highlighter, поскольку... он уже есть, и нагружать его подчеркиванием одного слова в тексте, причем не постоянным, не хочется. В мануале написано:

Цитировать
void QPlainTextEdit::setCurrentCharFormat ( const QTextCharFormat & format )
Sets the char format that is be used when inserting new text to format by calling QTextCursor::setCharFormat() on the editor's cursor. If the editor has a selection then the char format is directly applied to the selection.

То есть, вроде надо просто выделить нужное слово и поменять ему формат. Поэтому просто сделал так:

Код:
void Editor::setErrorPosition( unsigned int line, unsigned int pos )
{
    QTextCursor cursor = textCursor();
    cursor.movePosition( QTextCursor::Start );
    cursor.movePosition( QTextCursor::Down, QTextCursor::MoveAnchor, line - 1 );
    cursor.movePosition( QTextCursor::StartOfLine );
    cursor.movePosition( QTextCursor::Right, QTextCursor::MoveAnchor, pos );
    cursor.movePosition( QTextCursor::WordRight, QTextCursor::KeepAnchor );

    // гарантированно нужное слово selected, это проверено

    QTextCharFormat defcharfmt = currentCharFormat();
    QTextCharFormat newcharfmt = defcharfmt;
    newcharfmt.setUnderlineColor( QColor( Qt::red ) );
    newcharfmt.setUnderlineStyle( QTextCharFormat::WaveUnderline );

    setCurrentCharFormat( newcharfmt );

    cursor.movePosition( QTextCursor::WordLeft ); // снять выделение
    setCurrentCharFormat( defcharfmt ); // и вернуть умолчательный формат
}

однако никакого подчеркивания в тексте нет, что не так? думал, может последние 2 строки как-то мешают, забивал их - нет, ничего не меняется, и что самое странное - без них все равно формат не устанавливается, набираемый далее текст не имеет подчеркивания

где-то я наверно разрешающий флаг пропустил, но упоминания о нем нет в описании setCurrentCharFormat()

кто так делал, подскажите...
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Июль 21, 2011, 18:18 »

решено с помощью знатоков на qt developer forum, чтобы изменения в области курсора происходили в тексте, надо перед ними устанавливать в нем курсор вызовом setTextCursor( cursor ); ну и, сам я ранее заметил, что не было разрешения использовать подчеркивание, то есть,

Код:
cursor.movePosition( QTextCursor::Start );
cursor.movePosition( QTextCursor::Down, QTextCursor::MoveAnchor, line - 1 );
cursor.movePosition( QTextCursor::StartOfLine );
cursor.movePosition( QTextCursor::Right, QTextCursor::MoveAnchor, pos );
cursor.movePosition( QTextCursor::WordRight, QTextCursor::KeepAnchor );
setTextCursor( cursor );  // added
QTextCharFormat defcharfmt = currentCharFormat();
QTextCharFormat newcharfmt = defcharfmt;
newcharfmt.setFontUnderline( true ); // added
newcharfmt.setUnderlineColor( QColor( Qt::red ) );
newcharfmt.setUnderlineStyle( QTextCharFormat::WaveUnderline );
newcharfmt.setFontItalic( true );
setCurrentCharFormat( newcharfmt );
cursor.movePosition( QTextCursor::WordLeft );
setTextCursor( cursor ); // added
setCurrentCharFormat( defcharfmt );
setFocus();

работает как надо

несколько неожиданно, поскольку копия курсора позволяет взять текст под ним, но если начать менять, то она ничего не меняет
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июль 22, 2011, 13:51 »

попутно выяснился косяк в Qt - после выполнения setCurrentCharFormat( newcharfmt ); слетает установленный syntax highlighter, причем он не слетает полностью - текст, за исключением текущей строки отображается без подсветки синтаксиса, она есть только в текущей строке, и далее появляется только в измененных строках

лечится вызовом rehighlight() после setCurrentCharFormat( newcharfmt );
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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