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



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

我想在QListWidget的中心设置一个提示文本,当QListWidget有零项目时。

谢谢!

您必须重写 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_())

最新更新