title: How to list only the visible items in QTableView in pyqt
body: <p>I have below code to get filters for QTableView. But i am not able to filter multiple column at a time.</p>
  
  <p>i.e., if filter column 2 with <code>row 0 col 0</code> and try to filter column 2, it should show only the visible unique values of <code>column 2</code> (probably it should show <code>row 0 col 1</code> only) but now its showing all the elements of <code>column 2</code> (<code>row 0 col 1</code>, <code>row 1 col 1</code>, <code>row 2 col 1</code>)</p>
  
  <pre><code>#-*- 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.lineEdit       = QtGui.QLineEdit(self.centralwidget)
          self.view           = QtGui.QTableView(self.centralwidget)
          self.comboBox       = QtGui.QComboBox(self.centralwidget)
          self.label          = QtGui.QLabel(self.centralwidget)
  
          self.gridLayout = QtGui.QGridLayout(self.centralwidget)
          self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
          self.gridLayout.addWidget(self.view, 1, 0, 1, 3)
          self.gridLayout.addWidget(self.comboBox, 0, 2, 1, 1)
          self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
  
          self.setCentralWidget(self.centralwidget)
          self.label.setText("Regex Filter")
  
          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.comboBox.addItems(["Column {0}".format(x) for x in     range(self.model.columnCount())])
  
          self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)
          self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged)
  
          self.horizontalHeader = self.view.horizontalHeader()
          self.horizontalHeader.sectionClicked.connect(self.on_view_horizontalHeader_sectionClicked)
  
      @QtCore.pyqtSlot(int)
      def on_view_horizontalHeader_sectionClicked(self, logicalIndex):
          self.logicalIndex   = logicalIndex
          self.menuValues     = QtGui.QMenu(self)
          self.signalMapper   = QtCore.QSignalMapper(self)  
  
          self.comboBox.blockSignals(True)
          self.comboBox.setCurrentIndex(self.logicalIndex)
          self.comboBox.blockSignals(True)
  
          valuesUnique = [    self.model.item(row, self.logicalIndex).text()
                              for row in range(self.model.rowCount())
                              ]
  
          actionAll = QtGui.QAction("All", self)
          actionAll.triggered.connect(self.on_actionAll_triggered)
          self.menuValues.addAction(actionAll)
          self.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)  
              self.menuValues.addAction(action)
  
          self.signalMapper.mapped.connect(self.on_signalMapper_mapped)  
  
          headerPos = self.view.mapToGlobal(self.horizontalHeader.pos())        
  
          posY = headerPos.y() + self.horizontalHeader.height()
          posX = headerPos.x() + self.horizontalHeader.sectionPosition(self.logicalIndex)
  
          self.menuValues.exec_(QtCore.QPoint(posX, posY))
  
      @QtCore.pyqtSlot()
      def on_actionAll_triggered(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 on_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)
  
      @QtCore.pyqtSlot(str)
      def on_lineEdit_textChanged(self, text):
          search = QtCore.QRegExp(    text,
                                  QtCore.Qt.CaseInsensitive,
                                  QtCore.QRegExp.RegExp
                                  )
  
          self.proxy.setFilterRegExp(search)
  
      @QtCore.pyqtSlot(int)
      def on_comboBox_currentIndexChanged(self, index):
          self.proxy.setFilterKeyColumn(index)
  
  
  if __name__ == "__main__":
      import sys
  
      app  = QtGui.QApplication(sys.argv)
      main = myWindow()
      main.show()
      main.resize(400, 600)
      sys.exit(app.exec_())
  </code></pre>
  
  <p>When i run the above code i get the below output</p>
  
  <p><img src="https://i.stack.imgur.com/XxVxI.jpg" alt="enter image description here"></p>
  
  <p>When i click on Column 2 Header the filter list displayed is as below and its showing correctly (Unique values in that column)... </p>
  
  <p><img src="https://i.stack.imgur.com/eIhR9.jpg" alt="enter image description here"></p>
  
  <p>When i select <code>row 0 col 1</code> in the displayed filter, i get the following filtered list</p>
  
  <p><img src="https://i.stack.imgur.com/Fh35B.jpg" alt="enter image description here"></p>
  
  <p>But again when i click on the Column 2 header for filter it shows the same list as my 1st image. All the unique items of column 2 (from model view) and not from proxyfilter. Actually it should show only <code>row 0 col 1</code> as unique items in Column 2 are only <code>row 0 col 1</code></p>
  
  <p><img src="https://i.stack.imgur.com/SzNZh.jpg" alt="enter image description here"></p>