[英]How to initialize QAbstractTableModel with an empty 2d array while preserving headers
我將通過一個小例子來演示我的問題:
import sys
from PySide import QtCore, QtGui
class TaskModel(QtCore.QAbstractTableModel):
def __init__(self, tasks=[[" ", " ", " ", " "]]):
# def __init__(self, tasks=[[]]):
super().__init__()
self.__tasks = tasks
self.__headers = ["Folder", "Command", "Patterns", "Active", "Recursive"]
def rowCount(self, *args, **kwargs):
return len(self.__tasks)
def columnCount(self, *args, **kwargs):
coln = len(self.__tasks[0])
return coln
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
return self.__headers[section]
else:
# set row names: color 0, color 1, ...
return "%s" % str(section+1)
def data(self, index, role):
row = index.row()
col = index.column()
value = self.__tasks[row][col]
# text content
if role == QtCore.Qt.DisplayRole:
return value
def insertRows(self, position, rows, parent=QtCore.QModelIndex()):
self.beginInsertRows(parent, position, position + rows - 1)
row = ["a", "b", "c", "d"]
for i in range(rows):
self.__tasks.insert(position, row)
self.endInsertRows()
return True
class Mc(QtGui.QWidget):
def __init__(self):
super().__init__()
self.tab = QtGui.QTableView()
self.model = TaskModel()
self.tab.setModel(self.model)
self.addbtn = QtGui.QPushButton("Add")
self.addbtn.clicked.connect(self.insert)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.tab)
layout.addWidget(self.addbtn)
self.setLayout(layout)
def insert(self):
self.model.insertRow(0)
app = QtGui.QApplication(sys.argv)
mc = Mc()
mc.show()
sys.exit(app.exec_())
請注意,對於TaskModel類,我有兩行__init__
函數,第一行將[[“,”,“,”,“,”]]作為__task的默認數據集,第二行將[[]]作為默認數據集。
第一個很好用:
除了底部沒有多余的行。
第二個__init__
函數在嘗試刪除不需要的行時,使用[[]]作為默認數據集,但結果是災難性的:
我如何在仍使它工作的同時移除不需要的底部行(帶有標題和所有內容)?
之所以需要額外的行,是因為您通過將表模型的每個實例都設置為默認參數來強制它具有一個實例。 (此外,使用可變對象作為默認參數幾乎總是一個錯誤。如果這樣做,同一對象最終將在該類的所有實例之間共享)。
標頭缺失的問題是由實現columnCount
的方式引起的。 如果列表中的第一個任務為空,則列數將為零,因此不會顯示標題。
這是解決這些問題的一種方法:
class TaskModel(QtCore.QAbstractTableModel):
def __init__(self, tasks=None):
super().__init__()
self.__tasks = [] if tasks is None else tasks
self.__headers = ["Folder", "Command", "Patterns", "Active", "Recursive"]
def rowCount(self, *args, **kwargs):
return len(self.__tasks)
def columnCount(self, *args, **kwargs):
if self.__tasks:
return len(self.__tasks[0])
return len(self.__headers)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.