无法使用 QTableView/自定义表格模型设置标题数据 [英] Cannot set header data with QTableView / custom table model
问题描述
我使用的是 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屋!