2013-04-21 5 views
2

Извините, если это вопрос новичков. У меня есть код для маркировки ошибок в редакторе, и я не могу найти, как очистить маркировку, когда ошибки исчезли. Вот метод, который я вызываю для визуализации ошибок.Как очистить ExtraSelections в QPlainTextEdit

void Editor::highlightErrors(Thing* t) 
{ 
    if (!t) 
     return; 

    const std::vector<Thing::Error>& errors = t->errors(); 

    QTextCursor tc = textCursor(); 
    tc.select(QTextCursor::Document); 

    QList<QTextEdit::ExtraSelection> extraSelections; 
    for(int i = 0; i < errors.size(); ++i) { 
     const Thing::Error& error = errors[i]; 
     QTextEdit::ExtraSelection sel; 
     sel.format = this->errorFormat(); 
     sel.format.setToolTip(QString(error.error.c_str())); 
     sel.cursor = tc; 
     sel.cursor.clearSelection(); 
     sel.cursor.setPosition(error.startPos); 
     sel.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, error.endPos - error.startPos); 
     sel.cursor.mergeCharFormat(sel.format); 
     extraSelections.append(sel); 
    } 
    setExtraSelections(extraSelections); 
} 

Я ожидал бы QPlainTextEdit перекроить текст без ошибок формата, когда этот метод вызывается без ошибок, но это не так. QTextLayout :: draw правильно вызывается, а дополнительные выборы также очищаются, но текст по-прежнему рисуется с использованием формата ошибки.

Спасибо за помощь.

ответ

2

Кажется, это больше похоже на ошибку Qt.

Если ваш просто ищет исправление/обходной путь:

Добавьте это после того, как tc.select(QTextCursor::Document);:

tc.setCharFormat(textCursor().charFormat()); 

Это разбирайтесь вопрос вне.

Детали:

Это функция, которую я испытывал это с. Я просто запустил функцию int num и отформатировал эти позиции char как extraSelection с пользовательским форматом (не включает исправление, упомянутое выше).

void MainWindow::highlightErrors(int num) { 
    QTextCursor tc = ui_.textEdit->textCursor(); 
    tc.select(QTextCursor::Document); 
    QTextCharFormat format; 
    QColor lineColor = QColor(Qt::red); 
    format.setBackground(lineColor); 
    // format.setFontCapitalization(QFont::AllLowercase); 
    QList<QTextEdit::ExtraSelection> extraSelections; 
    for(int i = 0; i < num; ++i) { 
    QTextEdit::ExtraSelection selection; 
    selection.format = format; 
    selection.format.setToolTip(QString::number(i)); 
    selection.cursor = tc; 
    selection.cursor.clearSelection(); 
    selection.cursor.setPosition(i); 
    selection.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, 1); 
    // selection.cursor.mergeCharFormat(selection.format); 
    extraSelections.append(selection); 
    } 
    ui_.textEdit->setExtraSelections(extraSelections); 
} 

В приведенном выше коде написано 2 строки. Все, что происходит, - это красный фон. Теперь это прекрасно работает.

Однако, если мы раскомментируем format.setFontCapitalization(QFont::AllLowercase); и снова запустим, мы можем увидеть работу фона, как ожидалось, но изменения в нижнем регистре не применяются (убедитесь, что это шапки начинаются с) (Это то, что я считаю ошибкой Qt поскольку изменения формата применяются только частично)

Теперь, если мы также раскомментируем selection.cursor.mergeCharFormat(selection.format);, мы можем видеть, что формат нижнего регистра также применяется, но удаление формата перестает работать.

Следовательно, нам необходимо исправить сброс CharFormat() на весь документ, если errorSelection() is изменен.

Смежные вопросы