如何使用Model和QTableVi过滤和排序项目

2024-09-30 04:41:13 发布

您现在位置:Python中文网/ 问答频道 /正文

有三个QTableViews:A、B、C。这三个共享同一个源模型。在

有三个列名:“Items A”、“Items B”和“Items C”存储在self.columnNames列表中。在

每个QTableView都被分配了同一个ProxyModel的实例,代理的objectName设置为“proxyA”、“proxyB”和“proxyC”。在

我希望左边的QTableView使用一个标题为“items A”的列仅列出“A”项。在

中间的tableViewB应该只列出列标题为“Items B”的“Items_B”。在

第三个tableView应该只列出列名称设置为“items C”的项“C”。在

源代码如下。我真的很想知道怎么做。在

enter image description here

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os

class Model(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items =[ 
                    ['Item_A_0','Item_A_12','Item_C_330'],
                    ['Item_C_20','Item_B_11','Item_B_12'],
                    ['Item_C_101','Item_A_24','Item_B_77']
                    ]
        self.columnNames=['Items A', 'Items B', 'Items C']

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self.columnNames[col]

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable

    def rowCount(self, parent):
        return len(self.items)       
    def columnCount(self, parent):
        return len(self.columnNames)

    def data(self, index, role):
        if not index.isValid(): return QVariant()
        row=index.row()
        column=index.column()

        if row>len(self.items): return QVariant()        
        if column>len(self.items[row]): return QVariant()

        columnName=self.headerData(column, Qt.Horizontal, Qt.DisplayRole)

        if role == Qt.EditRole or role == Qt.DisplayRole:

            return QVariant(self.items[row][column])


        return QVariant()

    def setData(self, index, value, role=Qt.EditRole):
        if index.isValid():            
            if role == Qt.EditRole:
                row = index.row()
                column=index.column()
                if row>len(self.items) or column>len(self.items[row]):
                    return False
                else:

                    self.items[row][column]=value  
                    return True
        return False

class Proxy(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy, self).__init__()

    def filterAcceptsRow(self, row, parent):
        sourceModel=self.sourceModel()
        columns=sourceModel.columnCount(QModelIndex())        

        return True

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        tablemodel=Model(self) 
        proxyA=Proxy()
        proxyA.setObjectName('proxyA')
        proxyA.setSourceModel(tablemodel)              
        tableviewA=QTableView(self) 
        tableviewA.setModel(proxyA)    

        proxyB=Proxy()
        proxyB.setObjectName('proxyB')
        proxyB.setSourceModel(tablemodel)              
        tableviewB=QTableView(self) 
        tableviewB.setModel(proxyB)

        proxyC=Proxy()
        proxyC.setObjectName('proxyC')
        proxyC.setSourceModel(tablemodel)              
        tableviewC=QTableView(self) 
        tableviewC.setModel(proxyC)

        layout=QHBoxLayout(self)
        layout.addWidget(tableviewA)
        layout.addWidget(tableviewB)
        layout.addWidget(tableviewC)
        self.setLayout(layout)      

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

Tags: selfindexreturnifdefitemscolumnitem

热门问题