Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Июль 19, 2011, 18:59



Название: Не меняется формат символов в selection в QPlainTextEdit
Отправлено: Гурман от Июль 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()

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


Название: Re: Не меняется формат символов в selection в QPlainTextEdit
Отправлено: Гурман от Июль 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();

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

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


Название: Re: Не меняется формат символов в selection в QPlainTextEdit
Отправлено: Гурман от Июль 22, 2011, 13:51
попутно выяснился косяк в Qt - после выполнения setCurrentCharFormat( newcharfmt ); слетает установленный syntax highlighter, причем он не слетает полностью - текст, за исключением текущей строки отображается без подсветки синтаксиса, она есть только в текущей строке, и далее появляется только в измененных строках

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