簡體   English   中英

如何在保留標頭的同時使用空的2d數組初始化QAbstractTableModel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM