Как установить заполнитель текста в центре, когда QListWidget пуст? - PullRequest
1 голос
/ 05 февраля 2020

Как установить текст-заполнитель в центре, когда QListWidget пуст, это PySide2 / PyQt?

Я хочу установить текст подсказки в центре QListWidget, когда у QListWidget нулевой элемент.

Спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Вы должны переопределить метод paintEvent и нарисовать текст, если количество элементов равно нулю:

from PyQt5 import QtCore, QtGui, QtWidgets


class ListWidget(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._placeholder_text = ""

    @property
    def placeholder_text(self):
        return self._placeholder_text

    @placeholder_text.setter
    def placeholder_text(self, text):
        self._placeholder_text = text
        self.update()

    def paintEvent(self, event):
        super().paintEvent(event)
        if self.count() == 0:
            painter = QtGui.QPainter(self.viewport())
            painter.save()
            col = self.palette().placeholderText().color()
            painter.setPen(col)
            fm = self.fontMetrics()
            elided_text = fm.elidedText(
                self.placeholder_text, QtCore.Qt.ElideRight, self.viewport().width()
            )
            painter.drawText(self.viewport().rect(), QtCore.Qt.AlignCenter, elided_text)
            painter.restore()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = ListWidget()
    w.placeholder_text = "Stack Overflow"
    w.show()

    # test
    def on_timeout():
        import random

        if w.count() > 0:
            w.clear()
        else:
            w.addItems(["item-{}".format(i) for i in range(random.randint(5, 10))])


    timer = QtCore.QTimer(interval=1000, timeout=on_timeout)
    timer.start()

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