0

在stackoverflow关注者的帮助下,我得到了以下代码片段。

我现在可以过滤表格。但是当我尝试过滤它时,它首先排序,因为我为视图启用了排序。

我想以这样的方式创建 QTableview,如果我单击标题,它应该排序。并且应该在每个标题的右侧有一个下拉框(可能是组合框样式)。我正在上传我想要的快照(我在 .NET 中制作的)

代码片段

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui

class myWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)
        self.centralwidget  = QtGui.QWidget(self)
        self.view           = QtGui.QTableView(self.centralwidget)
        self.view.setSortingEnabled(True)
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.addWidget(self.view, 1, 0, 1, 3)

        self.setCentralWidget(self.centralwidget)

        self.model = QtGui.QStandardItemModel(self)

        for rowName in range(3) * 5:
            self.model.invisibleRootItem().appendRow(
                [   QtGui.QStandardItem("row {0} col {1}".format(rowName, column))    
                    for column in range(3)
                    ]
                )
        self.proxy = QtGui.QSortFilterProxyModel(self)
        self.proxy.setSourceModel(self.model)
    
        self.view.setModel(self.proxy)

        self.horizontalHeader = self.view.horizontalHeader()
        self.horizontalHeader.sectionClicked.connect(self.horizontalHeader_Clicked)

    @QtCore.pyqtSlot(int)
    def horizontalHeader_Clicked(self, logicalIndex):
        self.logicalIndex   = logicalIndex
        # local variable, and no parent
        menuValues = QtGui.QMenu()
        # delete the previous one
        try:
            self.signalMapper.deleteLater()
        except:
            pass
    
        self.signalMapper = QtCore.QSignalMapper(self)  

        valuesUnique = [    
            self.proxy.index(row, self.logicalIndex).data().toString()
            for row in xrange(self.proxy.rowCount())
            ]

        print 'printing col %d values' % self.logicalIndex                            
        for row in range(self.proxy.rowCount()):
            print 'row %d Item %s' % (row,self.model.item(row,     self.logicalIndex).text())
        
        
        actionAll = QtGui.QAction("All", self)
        actionAll.triggered.connect(self.actionAll)
        menuValues.addAction(actionAll)
        menuValues.addSeparator()
    
        for actionNumber, actionName in enumerate(sorted(list(set(valuesUnique)))):              
        
            action = QtGui.QAction(actionName, self)
            self.signalMapper.setMapping(action, actionNumber)  
            action.triggered.connect(self.signalMapper.map)  
            menuValues.addAction(action)

        self.signalMapper.mapped.connect(self.signalMapper_mapped)  

        headerPos = self.view.mapToGlobal(self.horizontalHeader.pos())        

        posY = headerPos.y() + self.horizontalHeader.height()
        posX = headerPos.x() + self.horizontalHeader.sectionPosition(self.logicalIndex)

        menuValues.exec_(QtCore.QPoint(posX, posY))

    @QtCore.pyqtSlot()
    def actionAll(self):
        filterColumn = self.logicalIndex
        filterString = QtCore.QRegExp(  "",
                                    QtCore.Qt.CaseInsensitive,
                                    QtCore.QRegExp.RegExp
                                    )

        self.proxy.setFilterRegExp(filterString)
        self.proxy.setFilterKeyColumn(filterColumn)

    @QtCore.pyqtSlot(int)
    def signalMapper_mapped(self, i):
        stringAction = self.signalMapper.mapping(i).text()
        filterColumn = self.logicalIndex
        filterString = QtCore.QRegExp(  stringAction,
                                    QtCore.Qt.CaseSensitive,
                                    QtCore.QRegExp.FixedString
                                    )

        self.proxy.setFilterRegExp(filterString)
        self.proxy.setFilterKeyColumn(filterColumn)
   
if __name__ == "__main__":
    import sys

    app  = QtGui.QApplication(sys.argv)
    main = myWindow()
    main.show()
    main.resize(400, 600)
    sys.exit(app.exec_())

这就是我想要得到的(排序和过滤)

在此处输入图像描述

如果可能的话,我需要能够为选定的列设置过滤器,如上图所示。

4

1 回答 1

1

这里有一个关于同一主题的讨论位置: QHeaderView's columns 中 QWidget 的快速方法?

他们建议您需要放弃QHeaderView视图中的库存,并为标题功能提供您自己的自定义小部件,以便将自定义小部件放入标题部分。

于 2013-01-04T16:43:04.107 回答