Advertisement
pblnrao

QTableView Sort & Filter

Jan 4th, 2013
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.32 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3.  
  4. from PyQt4 import QtCore, QtGui
  5.  
  6. class myWindow(QtGui.QMainWindow):
  7.     def __init__(self, parent=None):
  8.         super(myWindow, self).__init__(parent)
  9.         self.centralwidget  = QtGui.QWidget(self)
  10.         self.lineEdit       = QtGui.QLineEdit(self.centralwidget)
  11.         self.lineEdit.hide()
  12.         self.view           = QtGui.QTableView(self.centralwidget)
  13.         self.view.setSortingEnabled(True)
  14.         self.comboBox       = QtGui.QComboBox(self.centralwidget)
  15.         self.comboBox.hide()
  16.         self.label          = QtGui.QLabel(self.centralwidget)
  17.         self.label.hide()
  18.  
  19.         self.gridLayout = QtGui.QGridLayout(self.centralwidget)
  20.         self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
  21.         self.gridLayout.addWidget(self.view, 1, 0, 1, 3)
  22.         self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1)
  23.         self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
  24.  
  25.         self.setCentralWidget(self.centralwidget)
  26.         self.label.setText("Regex Filter")
  27.  
  28.         self.model = QtGui.QStandardItemModel(self)
  29.  
  30.         for rowName in range(3) * 5:
  31.             self.model.invisibleRootItem().appendRow(
  32.                 [   QtGui.QStandardItem("row {0} col {1}".format(rowName, column))    
  33.                     for column in range(3)
  34.                     ]
  35.                 )
  36.         self.proxy = QtGui.QSortFilterProxyModel(self)
  37.         self.proxy.setSourceModel(self.model)
  38.        
  39.         self.view.setModel(self.proxy)
  40.         self.comboBox.addItems(["Column {0}".format(x) for x in range(self.model.columnCount())])
  41.  
  42.         self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)
  43.         self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged)
  44.  
  45.         self.horizontalHeader = self.view.horizontalHeader()
  46.         self.horizontalHeader.sectionClicked.connect(self.on_view_horizontalHeader_sectionClicked)
  47.  
  48.     @QtCore.pyqtSlot(int)
  49.     def on_view_horizontalHeader_sectionClicked(self, logicalIndex):
  50.         self.logicalIndex   = logicalIndex
  51.         # local variable, and no parent
  52.         menuValues = QtGui.QMenu()
  53.         # delete the previous one
  54.         try:
  55.             self.signalMapper.deleteLater()
  56.         except:
  57.             pass
  58.        
  59.         self.signalMapper = QtCore.QSignalMapper(self)  
  60.  
  61.         self.comboBox.blockSignals(True)
  62.         self.comboBox.setCurrentIndex(self.logicalIndex)
  63.         self.comboBox.blockSignals(True)
  64.                                    
  65.         valuesUnique = [    
  66.             self.proxy.index(row, self.logicalIndex).data().toString()
  67.             for row in xrange(self.proxy.rowCount())
  68.         ]
  69.  
  70.         print 'printing col %d values' % self.logicalIndex                            
  71.         for row in range(self.proxy.rowCount()):
  72.             print 'row %d Item %s' % (row,self.model.item(row, self.logicalIndex).text())
  73.            
  74.         actionAll = QtGui.QAction("All", self)
  75.         actionAll.triggered.connect(self.on_actionAll_triggered)
  76.         menuValues.addAction(actionAll)
  77.         menuValues.addSeparator()
  78.  
  79.         for actionNumber, actionName in enumerate(sorted(list(set(valuesUnique)))):              
  80.            
  81.             action = QtGui.QAction(actionName, self)
  82.             self.signalMapper.setMapping(action, actionNumber)  
  83.             action.triggered.connect(self.signalMapper.map)  
  84.             menuValues.addAction(action)
  85.  
  86.         self.signalMapper.mapped.connect(self.on_signalMapper_mapped)  
  87.  
  88.         headerPos = self.view.mapToGlobal(self.horizontalHeader.pos())        
  89.  
  90.         posY = headerPos.y() + self.horizontalHeader.height()
  91.         posX = headerPos.x() + self.horizontalHeader.sectionPosition(self.logicalIndex)
  92.  
  93.         menuValues.exec_(QtCore.QPoint(posX, posY))
  94.  
  95.     @QtCore.pyqtSlot()
  96.     def on_actionAll_triggered(self):
  97.         filterColumn = self.logicalIndex
  98.         filterString = QtCore.QRegExp(  "",
  99.                                         QtCore.Qt.CaseInsensitive,
  100.                                         QtCore.QRegExp.RegExp
  101.                                         )
  102.  
  103.         self.proxy.setFilterRegExp(filterString)
  104.         self.proxy.setFilterKeyColumn(filterColumn)
  105.  
  106.     @QtCore.pyqtSlot(int)
  107.     def on_signalMapper_mapped(self, i):
  108.         stringAction = self.signalMapper.mapping(i).text()
  109.         filterColumn = self.logicalIndex
  110.         filterString = QtCore.QRegExp(  stringAction,
  111.                                         QtCore.Qt.CaseSensitive,
  112.                                         QtCore.QRegExp.FixedString
  113.                                         )
  114.  
  115.         self.proxy.setFilterRegExp(filterString)
  116.         self.proxy.setFilterKeyColumn(filterColumn)
  117.  
  118.     @QtCore.pyqtSlot(str)
  119.     def on_lineEdit_textChanged(self, text):
  120.         search = QtCore.QRegExp(    text,
  121.                                     QtCore.Qt.CaseInsensitive,
  122.                                     QtCore.QRegExp.RegExp
  123.                                     )
  124.  
  125.         self.proxy.setFilterRegExp(search)
  126.  
  127.     @QtCore.pyqtSlot(int)
  128.     def on_comboBox_currentIndexChanged(self, index):
  129.         self.proxy.setFilterKeyColumn(index)
  130.        
  131. if __name__ == "__main__":
  132.     import sys
  133.  
  134.     app  = QtGui.QApplication(sys.argv)
  135.     main = myWindow()
  136.     main.show()
  137.     main.resize(400, 600)
  138.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement