[PySide] QAbstractTextDocumentLayout.PaintContext missing `selections` attribute.

Grégory Pijat pijat.gregory at gmail.com
Thu Jan 26 03:45:57 CET 2023


Hey pyside mailing list, it's my first time participating in a mailing
list, I hope I'm at the right place for my question/bug report.

*What I'm doing:*
I'm working on a custom widget to display an immense amount of words
(QPlainTextEdit is too slow for what I need) so here's how I'm doing it:
- Custom Widget
- QTextDocument
- QTextDocument.draw with a QAbstractTextDocumentLayout.PaintContext

*My Problem:*
I need to implement selection, so I'm calculating which part of the text is
selected by comparing press and release position in the document. This
works fine, I can retrieve the selected text.
BUT, when I want to highlight the selection using the `selections` argument
that should be available in the QAbstractTextDocumentLayout.PaintContext
instance, it fails, this seems to be missing.

I tested this in PyQt too and it works fine, it just looks like it's
missing from PySide. (I'm using PySide2).

Here's my code:
```

import sysfrom PyQt5 import QtWidgets, QtGui, QtCore

LOREM_IPSUM = \'''
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Morbi dictum ligula mi, ut venenatis urna molestie et.
Phasellus velit nunc, consequat nec felis ut, egestas pulvinar mi.
In hac habitasse platea dictumst.
Mauris eget faucibus est, vitae suscipit neque.
Curabitur elementum tellus nec mauris rutrum laoreet.
Duis condimentum consequat dui sit amet semper.
Nam varius aliquet nibh, sit amet molestie ex scelerisque a.
Donec sodales, sapien non consequat luctus, ante quam pretium nibh,
sed egestas augue nunc et augue.
'''

class TextEdit(QtWidgets.QWidget):
    def __init__(self, document, parent=None):
        super(TextEdit, self).__init__(parent=None)

        self._document = document
        self._selectionStart = 0
        self._selectionEnd = 0

        self.cur = QtGui.QTextCursor(self._document)

        self._selectionFormat = QtGui.QTextCharFormat()
        self._selectionFormat.setBackground(QtGui.QColor('#2B4A69'))

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)

        # This is the problematic area
        ctx = QtGui.QAbstractTextDocumentLayout.PaintContext()
        selection = QtGui.QAbstractTextDocumentLayout.Selection()
        selection.cursor = self.cur
        selection.format = self._selectionFormat
        # print(ctx.selections)  # Works in PyQt5, not PySide2 where
the attribute is missing.
        ctx.selections = [selection]

        self._document.documentLayout().draw(painter, ctx)

    def mousePressEvent(self, event):
        start = end =
self._document.documentLayout().hitTest(event.pos(),
QtCore.Qt.FuzzyHit)
        self.cur.setPosition(start)
        self.cur.setPosition(end, QtGui.QTextCursor.KeepAnchor)

        self.update()

    def mouseMoveEvent(self, event):
        end = self._document.documentLayout().hitTest(event.pos(),
QtCore.Qt.FuzzyHit)
        self.cur.setPosition(end, QtGui.QTextCursor.KeepAnchor)

        self.update()


if __name__ == "__main__":
    if QtWidgets.QApplication.instance() is not None:
        app = QtWidgets.QApplication.instance()
    else:
        app = QtWidgets.QApplication([])

    doc = QtGui.QTextDocument()
    doc.setPlainText(LOREM_IPSUM)

    widget = TextEdit(doc)
    widget.show()

    sys.exit(app.exec_())```

I've asked this on StackOverflow but I was told I should try in the
mailing list, so here am I.
-> https://stackoverflow.com/questions/75077964/qabstracttextdocumentlayout-paintcontext-works-in-pyqt5-but-not-pyside2?noredirect=1#comment132502605_75077964

Looks like someone opened a bug report but was ignored:
-> https://bugreports.qt.io/browse/PYSIDE-1220
*Does anyone knows something about this ? Is it normal ? Is there a
workaround ?
If it's a real bug, I guess it won't be fixed for PySide2, only in a
future release of PySide6 ? *

Thank you ! :)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20230125/cb245e5f/attachment.htm>


More information about the PySide mailing list