Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QTextFormat::FullWidthSelection but for multiple lines?



  • The Code Editor Example shows how to highlight the full width of the current line: https://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html

    It does this using QTextFormat::FullWidthSelection as follows:

    QList<QTextEdit::ExtraSelection> extraSelections;
    
        if (!isReadOnly()) {
            QTextEdit::ExtraSelection selection;
    
            QColor lineColor = QColor(Qt::yellow).lighter(160);
    
            selection.format.setBackground(lineColor);
            selection.format.setProperty(QTextFormat::FullWidthSelection, true);
            selection.cursor = textCursor();
            selection.cursor.clearSelection();
            extraSelections.append(selection);
        }
    
        setExtraSelections(extraSelections);
    

    For things that display as multiple lines due to word wrapping, I would like it to highlight every line that is a part of the current block (I think that is the right terminology for it). But QTextFormat::FullWidthSelection doesn't seem to do that. It's only highlighting the current line, one line at a time.

    I tried highlighting the block as a whole instead, but that's not the same behavior as highlighting the full width of the line(s) themselves and I'm struggling to find if there's a way to manually recreate the selection behavior of QTextFormat::FullWidthSelection but for an entire block.



  • I think I figured out a solution. Could probably be a bit cleaner, but this seems to work ok so far. Basically am iterating through the block's lines and do full width selection for each.

    QTextCursor cursor = textCursor();
    cursor.clearSelection();
    cursor.movePosition(QTextCursor::StartOfBlock);
    for (int i = 0; i < cursor.block().lineCount(); i++)
    {
        QTextEdit::ExtraSelection selection;
    
        QColor lineColor = QColor(Qt::lightGray);
    
        selection.format.setBackground(lineColor);
        selection.format.setProperty(QTextFormat::FullWidthSelection, true);
        selection.cursor = cursor;
        extraSelectionList.append(selection);
    
        if (i + 1 < cursor.block().lineCount())
            cursor.movePosition(QTextCursor::Down);
    }
    

Log in to reply