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

时间:2015-01-23 08:21:25

标签: python qt model pyqt qtableview

有三个QTableViews:A,B,C。所有三个共享相同的SourceModel。

有三个列名:"项目A","项目B"和"项目C"存储在self.columnNames列表中。

为每个QTableView分配了一个相同ProxyModel的实例,其代理的objectName设置为" proxyA"," proxyB"和" proxyC"。

我希望左侧QTableView仅列出项目" A"使用单个列,其标题名为"项目A"。

中间tableViewB应该只列出" Items_B"列标题称为"项目B"。

第三个tableView应该只列出项目" 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_())

0 个答案:

没有答案