Python qt: modelview

From wikinotes

Documentation

official Qt5 modelview tutorial https://doc.qt.io/qt-5/modelview.html

Core

qt modelview: models
qt modelview: views
qt modelview: delegates


Patterns

I've found the following pattern very flexible while using model/view in Qt. It allows you to reuse behaviours (in form of QActions) in different model/view variations.

In practice there is generally only one model, but possibly multiple views.

window/
    actions/
        __init__.py
        windowactions.py    # code restricted to interface of model/view

    models/
        __init__.py
        windowmodelbase.py  # interface of model
        windowmodel.py

    views/
        __init__.py
        windowviewbase.py   # interface of view
        windowview.py

    __init__.py

Example QAction Implementation

class WindowCreateAction(QtWidgets.QAction):
    def __init__(self, view):
        if not isinstance(view, windowviewbase.WindowViewBase):
            raise TypeError()

        super(WindowCreateAction, self).__init__('Create Window Item', view)
        self.setIcon(my_qicon)
        self.setShortCut(QtCore.Qt.Key_New)
        view.addAction(self)       # adds shortcuts to view's eventloop

        self._view = view
        self.triggered.connect(self._handle_triggered)

    def _handle_triggered(self, *args, **kwargs):
        # create your window item
  • windowview and windowactions both refer to windowviewbase for type-checks
  • actions are entirely standalone, and use only the interface outlined in windowviewbase and windowmodelbase
  • actions can be added/removed to any view with minimal effort