Как создать комбо-фильтр для Qtables в pyqt

Ниже приведен фрагмент кода с помощью последователей stackru.

Теперь я могу отфильтровать таблицу. но когда я пытаюсь фильтровать, сначала сортирует, так как я включил сортировку для представления.

Я хочу создать QTableview таким образом, чтобы при нажатии на заголовок он сортировался. и должен иметь выпадающий список (может быть в стиле combox box) справа от каждого заголовка. я загружаю снимок того, как я хочу (что я сделал в.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_())

Это я, как я пытаюсь получить (сортировка и фильтрация)

введите описание изображения здесь

Если возможно, мне нужна возможность установить фильтр только для выбранных столбцов, как на картинке выше.

1 ответ

Решение

Здесь есть место для обсуждения на ту же тему: Быстрый путь для QWidget в столбцах QHeaderView?

Они предполагают, что вам нужно будет бросить запас QHeaderView на ваш взгляд, и предоставьте свой собственный виджет для функциональности заголовка, чтобы разместить пользовательские виджеты в разделах заголовка.

Другие вопросы по тегам