Вы должны переопределить метод 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_())