[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