无法使用 QTableView/自定义表格模型设置标题数据 [英] Cannot set header data with QTableView / custom table model

查看:274
本文介绍了无法使用 QTableView/自定义表格模型设置标题数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 Maya/PySide2/Python 2.7

I am on Maya / PySide2 / Python 2.7

我无法使用自定义表模型设置标题数据.

I cannot set the header data with a custom table model.

我试过了:

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        
        self.setHeaderData(0, Qt.Horizontal, "Driver")
        self.setHeaderData(1, Qt.Horizontal, "Range")
        self.setHeaderData(2, Qt.Horizontal, "Driven")
        self.setHeaderData(3, Qt.Horizontal, "Range")
        
        self._data = 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 4
        
    def addRow(self, row):
        self._data.append(row)
        self.layoutChanged.emit()  

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.table = QtWidgets.QTableView()

        data = [
        [
            "firstData", "[0, 100]", "secondData", "[0, 1]"],
        ]

        self.model = TableModel(data)
        self.table.setModel(self.model)
        
        self.setCentralWidget(self.table)

window=MainWindow()
window.show()

之后我尝试在像这样设置模型后设置标题:

afterwards I tried setting the header after setting the model like this:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.table = QtWidgets.QTableView()

        data = [
        [
            "firstData", "[0, 100]", "secondData", "[0, 1]"],
        ]

        self.model = TableModel(data)
        self.table.setModel(self.model)
        
        self.model.setHeaderData(0, Qt.Horizontal, "Driver")
        self.model.setHeaderData(1, Qt.Horizontal, "Range")
        self.model.setHeaderData(2, Qt.Horizontal, "Driven")
        self.model.setHeaderData(3, Qt.Horizontal, "Range")
        
        self.setCentralWidget(self.table)

window=MainWindow()
window.show()

它们都没有抛出错误但列标题没有被重命名,它们保持为 1,2,3,4

Both of them throwing no errors but column headers are not getting renamed, they stay as 1,2,3,4

推荐答案

在实现抽象模型时,必须实现所有需要的方法,否则将使用默认的方法.在标题标签的情况下,回退是 headerData()(在默认实现中返回 None)和 <代码>setHeaderData().后者很重要,因为它总是返回一个 bool 值,指示数据是否已设置:抽象模型的默认行为是不设置数据,因为必须实现该方法.

When implementing an abstract model, all the required methods should be implemented, otherwise the default ones will be used. In the case of header labels, the fallback is the headerData() (which returns None in the default implementation) and setHeaderData(). The latter is important, as it always returns a bool value indicating whether the data has been set or not: the default behavior of abstract models is that no data is set, because the method must be implemented.

为了正确实现头数据的读写,你必须重写这两种方法:

In order to correctly implement both reading and writing of header data, you must override both methods:

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        
        self.horizontalHeaders = [''] * 4

        self.setHeaderData(0, Qt.Horizontal, "Driver")
        self.setHeaderData(1, Qt.Horizontal, "Range")
        self.setHeaderData(2, Qt.Horizontal, "Driven")
        self.setHeaderData(3, Qt.Horizontal, "Range")
        
        self._data = data

    def setHeaderData(self, section, orientation, data, role=Qt.EditRole):
        if orientation == Qt.Horizontal and role in (Qt.DisplayRole, Qt.EditRole):
            try:
                self.horizontalHeaders[section] = data
                return True
            except:
                return False
        return super().setHeaderData(section, orientation, data, role)

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            try:
                return self.horizontalHeaders[section]
            except:
                pass
        return super().headerData(section, orientation, role)

    # ...

这篇关于无法使用 QTableView/自定义表格模型设置标题数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆