表格出现之前的QtableView占位符文本

Posted

技术标签:

【中文标题】表格出现之前的QtableView占位符文本【英文标题】:QtableView placeholder text before table appears 【发布时间】:2020-10-03 12:27:49 【问题描述】:

我有一个非常简单的 QtableView,就像程序运行后填充的一样。该程序需要几秒钟才能像这样填充表格..

我想知道如何在程序运行之前在 QTableView 上启用占位符文本“无数据”...

【问题讨论】:

【参考方案1】:

您必须覆盖您检查是否没有模型或模型没有行的paintEvent方法,然后绘制占位符文本:

from PySide2 import QtCore, QtGui, QtWidgets


class TableView(QtWidgets.QTableView):
    def paintEvent(self, event):
        super().paintEvent(event)
        if self.model() is not None and self.model().rowCount() > 0:
            return
        painter = QtGui.QPainter(self.viewport())
        painter.save()
        col = self.palette().placeholderText().color()
        painter.setPen(col)
        fm = self.fontMetrics()
        elided_text = fm.elidedText(
            "No data", 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 = TableView()
    model = QtGui.QStandardItemModel(0, 3)
    w.setModel(model)
    w.resize(640, 480)
    w.show()

    def on_timeout():
        if model.rowCount() > 0:
            model.setRowCount(0)
        else:
            for j in range(4):
                items = [
                    QtGui.QStandardItem(f"item (j-i)")
                    for i in range(model.columnCount())
                ]
                model.appendRow(items)

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

    sys.exit(app.exec_())

【讨论】:

仅供参考,对于使用 Pyside2 的人,您只需从几行中删除“QtCore”即可使表格视图正常工作,否则您将遇到依赖问题。

以上是关于表格出现之前的QtableView占位符文本的主要内容,如果未能解决你的问题,请参考以下文章

在加载的数据填充工作表之前,Vue 如何在 v-card 中将文本作为占位符?

将占位符添加到表格视图单元格上的文本字段

AlamofireImage 占位符图像在缓存图像之前简要显示 v3.1

单击指定单元格后,在搜索栏占位符中获取表格视图单元格文本值

在占位符文本之前使用图标搜索输入 - Material Design

PowerPoint2010占位符