[Interest] QSyntaxHighlighter change QTextBlockFormat

Tony Rietwyk tony at rightsoft.com.au
Wed Jan 5 06:16:21 CET 2022


On 5/01/2022 3:30 pm, Joshua Grauman wrote:
> Hi all,
>
> I have been researching how to have a QSyntaxHighlighter change 
> QTextBlockFormat. I need my syntax highlighter to change the indent, 
> left and right margins, line height, etc. of a QTextDocument/QTextEdit.
>
> I was able to have my class derived from QSyntaxHighlighter change the 
> QTextBlockFormat of individual blocks easy enough using the 
> QTextCursor interface, but the problem with that is that it messes up 
> undo/redo functionality. All of the block format changes go onto the 
> undo/redo stack and so make undo/redo unusable.
>
> I have tried to find a way to modify QTextBlockFormat directly 
> (getting the QTextLayout * of the current block and trying 
> setPosition() on it, or even trying to move the individual lines of 
> the QTextLayout), but it can't modify it here as I suspected (at least 
> the way I tried it).
>
> I can't find any other way to modify QTextBlockFormat in a way that 
> won't be recorded onto the undo/redo stack.
>
> So my options are (that I can see):
>
> 1) Roll my own complete undo/redo stack for QTextDocument/QTextEdit. This
>    seems overkill since it's already written.
>
> 2) Modify Qt to be able to disable the undo/redo stack temporarily while
>    the QSyntaxHighlighter is changing the block format. There's already a
>    function QTextDocument::setUndoRedoEnabled(bool enable). But I can't
>    use it directly because it clears the undo/redo stack (the docs says
>    the undo stack, but the code looks like it's clearing the redo
>    stack???). Either way I need to modify
>    QTextDocument::setUndoRedoEnabled(bool enable) so that it can enable
>    and disable undo/redo without clearing the stack(s). It would seem 
> like
>    I could add a second parameter to the function with a default value to
>    work like it does currently, but with an option that can be added to
>    not clear the stack. Although I've only written 2-3 patches for Qt,
>    this seems easy enough that I could do it. But I wanted to check first
>    if this seems like a reasonable approach and would be likely to be
>    accepted.
>
> Obviously, I would like to take option 2, but I wanted feedback first. 
> Does that seem like a reasonable approach? Will it be likely to be 
> included in Qt? I don't want to write a patch if there are clear 
> problems with the approach. Also, if anyone has a way to easily modify 
> the blockformat of a block without affecting undo/redo, that would be 
> great. Or even if someone has rolled their own undo/redo for 
> QTextDocument, I suppose I could use that. Thanks for any help, it is 
> greatly appreciated.
>
> Josh
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest

Hi Josh,

Just a wild guess, but do these syntax changes occur after loading the 
document, or while editing?  If the latter, maybe the syntax changes 
could be grouped with the triggering command as a single undo/redo action?

Regards, Tony



More information about the Interest mailing list