猿问

如何为 QTableView 列设置标题标签?

我正在使用 PyQt5 开发一个 Python GUI 应用程序,它有一个用于显示数据的 QTableView。


这是代码:


import sys


from PyQt5 import QtWidgets, QtCore

from PyQt5.QtCore import Qt



class DataModel(QtCore.QAbstractTableModel):

    def __init__(self):

        super().__init__()

        self.data = []


    def data(self, index, role):

        if role == Qt.DisplayRole:

            return self.data[index.row()][index.column()]


    def rowCount(self, index):

        return len(self.data)


    def columnCount(self, index):

        return len(self.data[0])



class MainWindow(UI.UserInterface):

    def __init__(self):

        super().__init__()

        self.model = DataModel()

        self.load()

        self.TableView.setModel(self.model)

        self.TableView.resizeColumnsToContents()

        self.TableView.horizontalHeader().setStretchLastSection(True)


    def load(self):

        try:

            self.model.data = [(1, '2020-01-10 00:00:00', 'KANIA', 'HENRYK', 4219)]

        except Exception:

            pass



if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec_()

该类UI.UserInterface位于单独的模块中。它具有QWidgets的界面和布局QWidgets。其中之一是QTableView。


我似乎找不到一种方法来设置QTableView.


我寻找了不同的解决方案(其中一些如下),但没有一个有效:


https://doc.qt.io/qt-5/sql-presenting.html(这个是C++写的,不太懂)



UYOU
浏览 290回答 3
3回答

冉冉说

您必须实施headerData():class DataModel(QtCore.QAbstractTableModel):    # ...    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:            return 'Column {}'.format(section + 1)        return super().headerData(section, orientation, role)显然,即使使用包含要显示的标签的简单列表,您也可以设置自己的标签。请注意,为子类命名新属性时应非常小心,因为它们可能已经存在。最重要的是,您不应该覆盖self.data.

青春有我

这是一个使用 QtableView 和一组 headerdata 的示例,您将能够修改 tableview 中的数据def exemple_table(self):        database = QSqlDatabase("QPSQL")        database.setHostName("localhost")        database.setDatabaseName("database")        database.setUserName("postgres")        database.setPassword("password")        database.open()                model_ft = QSqlTableModel(db=database)        model_ft.setTable('table')                model_ft.setHeaderData(0, Qt.Horizontal,"id")        model_ft.setHeaderData(1, Qt.Horizontal,"exemple01")        model_ft.setHeaderData(2, Qt.Horizontal,"exemple02")        model_ft.setHeaderData(3, Qt.Horizontal,"exemple03")        model_ft.setHeaderData(4, Qt.Horizontal,"exemple04")        model_ft.setHeaderData(5, Qt.Horizontal,"exemple05")        model_ft.setHeaderData(6, Qt.Horizontal,"exemple06")        model_ft.setHeaderData(7, Qt.Horizontal,"exemple07")                model_ft.removeColumns(8,1)        date = str(datetime.date.today())                self.tableView.setModel(model_ft)        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)                model_ft.setSort(0, Qt.DescendingOrder)        model_ft.select()        filter_ft = "date_d ='%s' " % (date_1)        model_ft.setFilter(filter_ft)

HUH函数

设置列和行名称的覆盖headerData方法QTableAbstractModeldef headerData(self, section: int, orientation: PySide6.QtCore.Qt.Orientation, role: int = ...):    #for setting columns name    if orientation == Qt.Horizontal and role == Qt.DisplayRole:        return f"Column {section + 1}"    #for setting rows name    if orientation == Qt.Vertical and role == Qt.DisplayRole:        return f"Row {section + 1}"工作代码:import sysimport requestsimport PySide6from PySide6.QtWidgets import QTableView, QWidget, QApplication, QGridLayout, QHeaderViewfrom PySide6.QtCore import Qt, QAbstractTableModelfrom PySide6.QtGui import QColor, QIcon, QPixmapfrom datetime import datetimeclass MagicIcon():    def __init__(self, link):        self.link = link        self.icon = QIcon()        try:            response = requests.get(self.link)            pixmap = QPixmap()            pixmap.loadFromData(response.content)            self.icon = QIcon(pixmap)        except:            passclass TableModel(QAbstractTableModel):    def headerData(self, section: int, orientation: PySide6.QtCore.Qt.Orientation, role: int = ...):        if orientation == Qt.Horizontal and role == Qt.DisplayRole:            # return f"Column {section + 1}"            return self.columns[section]        if orientation == Qt.Vertical and role == Qt.DisplayRole:            return f"{section + 1}"    def __init__(self, _data):        self.columns = ["Account", "Investment", "KYC", "Investment Date"]        # super().__init__(self)        super(TableModel, self).__init__()        self._data = _data        self.calendarLink = "https://img.icons8.com/fluency/48/000000/windows-calendar.png"        self.dollarLink = "https://img.icons8.com/external-vitaliy-gorbachev-lineal-color-vitaly-gorbachev/40/000000/external-dollar-currency-vitaliy-gorbachev-lineal-color-vitaly-gorbachev-1.png"        self.analysis = "https://img.icons8.com/external-flatarticons-blue-flatarticons/65/000000/external-analysis-digital-marketing-flatarticons-blue-flatarticons-1.png"        self.bug = "https://img.icons8.com/offices/30/000000/bug.png"        self.account = "https://img.icons8.com/plumpy/24/000000/edit-administrator.png"        self.approvedLink = "https://img.icons8.com/external-bearicons-flat-bearicons/40/000000/external-approved-approved-and-rejected-bearicons-flat-bearicons-9.png"        self.rejectedLink = "https://img.icons8.com/external-bearicons-flat-bearicons/40/000000/external-rejected-approved-and-rejected-bearicons-flat-bearicons-11.png"        self.naLink = "https://img.icons8.com/color/48/000000/not-applicable.png"        self.calendarIcon = MagicIcon(self.calendarLink).icon        self.accountIcon = MagicIcon(self.account).icon        self.dollarIcon = MagicIcon(self.dollarLink).icon        self.approvedIcon = MagicIcon(self.approvedLink).icon        self.rejectedIcon = MagicIcon(self.rejectedLink).icon        self.naIcon = MagicIcon(self.naLink).icon    def data(self, index, role):        if role == Qt.DisplayRole:            value = self._data[index.row()][index.column()]            if isinstance(value, datetime):                return value.strftime("%Y-%m-%d")            if isinstance(value, float):                return f"{value:.2f}"            return value        if role == Qt.TextAlignmentRole:            return Qt.AlignHCenter + Qt.AlignVCenter        if role == Qt.BackgroundRole:            return QColor("#adcdff") if index.row() % 2 == 0 else QColor("#d8ffc2")        if role == Qt.DecorationRole:            value = self._data[index.row()][index.column()]                        if value is None:                return self.naIcon            if isinstance(value, datetime):                return self.calendarIcon            if index.column() == 0:                return self.accountIcon            if index.column() == 1:                return self.dollarIcon            if index.column() == 2:                if value == True:                    return self.approvedIcon                elif value == False:                    return self.rejectedIcon                return self.naIcon    def rowCount(self, index):        return len(self._data)    def columnCount(self, index):        return len(self._data[0])class MainWindow(QWidget):    def __init__(self):        # super().__init__()        super(MainWindow, self).__init__()        self.resizeEvent = self.onResize        self.table = QTableView()                self.setWindowIcon(MagicIcon(            "https://img.icons8.com/external-flatarticons-blue-flatarticons/65/000000/external-analysis-digital-marketing-flatarticons-blue-flatarticons-1.png"        ).icon)        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)        # self.table.setSizeAdjustPolicy(QHeaderView.AdjustIgnored)        # self.table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)        data = [            ["Andrew Mike", 15.255, True, datetime(2022, 1, 5)],            ["Eliza Petterson", 353.555, False, datetime(2020, 1, 5)],            ["Joseph Samuel", 123, None, datetime(2020, 1, 15)],            ["Nita Singh", 266, True, datetime(2022, 2, 7)],            ["Rahul Chakrabarti", 102, True, datetime(2019, 10, 15)],        ]        self.model = TableModel(data)        self.table.setModel(self.model)        self.header = self.table.horizontalHeader()        # self.header.setSectionResizeMode(0, QHeaderView.Stretch)        # self.header.setSectionResizeMode(1, QHeaderView.)        # self.header.setSectionResizeMode(2, QHeaderView.ResizeToContents)        self.layout = QGridLayout()        self.layout.addWidget(self.table, 0, 0)        self.setLayout(self.layout)    def onResize(self, event):        # print('old', event.oldSize(), 'new', event.size())        # super(MainWindow, self).resizeEvent(event)        passif __name__ == "__main__":    app = QApplication(sys.argv)    wid = MainWindow()    wid.show()    sys.exit(app.exec())
随时随地看视频慕课网APP

相关分类

Python
我要回答