QListWidget为空时如何在中心设置占位符文本?

问题描述 投票:1回答:1

当QListWidget为空时如何在中心设置占位符文本为PySide2 / PyQt?

当QListWidget的项为零时,我想在QListWidget的中心设置提示文本。

谢谢!

pyqt5 pyside2
1个回答
0
投票

如果项目数为零,则必须重写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_())
© www.soinside.com 2019 - 2024. All rights reserved.