0

私はstackoverflowフォロワーの助けを借りて以下のコードスニペットを持っています。

これでテーブルをフィルタリングできます。しかし、フィルターをかけようとすると、ビューの並べ替えを有効にしたため、最初に並べ替えられます。

ヘッダーをクリックするとソートされるようにQTableviewを作成したいと思います。また、すべてのヘッダーの右側にドロップダウンボックス(comboxボックススタイルの場合があります)が必要です。好きなようにスナップをアップロードしています(.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 の列で QWidget のクイック ウェイ?

QHeaderView彼らは、カスタム ウィジェットをヘッダー セクションに配置するには、ビュー内のストックを捨てて、ヘッダー機能用に独自のカスタム ウィジェットを提供する必要があることを示唆しています。

于 2013-01-04T16:43:04.107 に答える