PySide QTableView Custom PaintEvent
In a tool I am writing I have a table view in which I want to display some informative text to the user when the view is “empty” i.e. the model has no rows. My initial idea was to overlay the view with a label but this felt a bit to hacky. I ended up on a SO post that subclassed a QTableView and implemented som custom drawing in the paintEvent when the model was empty. I liked this approach and implemented that in Python. Below is some information from the PySide docs on QPainter. I wanted to understand if I needed to call the begin() and end() when I did the painting.
- class PySide.QtGui.QPainter(arg__1)
- Parameters: arg__1 – PySide.QtGui.QPaintDevice
Constructs a painter that begins painting the paint device immediately.
This constructor is convenient for short-lived painters, e.g. in a QWidget.paintEvent() and should be used only once. The constructor calls PySide.QtGui.QPainter.begin() for you and the PySide.QtGui.QPainter destructor automatically calls PySide.QtGui.QPainter.end() .
Here’s an example using PySide.QtGui.QPainter.begin() and PySide.QtGui.QPainter.end() :
def paintEvent(self, paintEvent): p = QPainter() p.begin(self) p.drawLine(...) # drawing code p.end()
The same example using this constructor:
def paintEvent(self, paintEvent): p = QPainter(self) p.drawLine(...) # drawing code
And this is the CustomTableView
class CustomTableView(QtWidgets.QTableView): def __init__(self, *args, **kwargs): super(CustomTableView, self).__init__(*args, **kwargs) self._text = ' Right Click to Add / Remove ' def paintEvent(self, event): if self.model() and self.model().rowCount() > 0: super(CustomTableView, self).paintEvent(event) else: qp = QtGui.QPainter(self.viewport()) qp.setPen(QtGui.QColor(175, 175, 175)) rect = QtCore.QRect(qp.fontMetrics().boundingRect(self._text)) rect.moveCenter(self.viewport().rect().center()) qp.drawText(rect, QtCore.Qt.AlignCenter, self._text)
If you have some feedback or ideas on how to improve this workflow please let me know.