Как создать фильтры для QTableView в PyQt

I am using QTableView to display data retrieved from QtSql.QSqlQuery

Я хочу знать, как я могу создать фильтры для него как в, выделяются.

enter image description here

По вышеупомянутому изображению я должен получить фильтры для Всего heders (Sh_Code, SH_Seq, Стадия) У фильтров будут уникальные ценности в той колонки, на которой мы можем отфильтровать.

Необходимый результат

Мне нужен заголовок Табличного представления с Dropbox, перечисляющим все уникальные ценности в той колонке точно так же, как в выделяются ниже. Никакая потребность Вершины, Стандарт фильтрует... как показано по изображению. Нужны только "Все" и уникальные "пункты колонки"

enter image description here

Это из моего.NET заявления, загруженного для большей ясности

enter image description here

8
nl ja de

1 ответы

Вот пример просачивания PyQt, используя QSortFilterProxyModel , QStandardItemModel и QTableView , это может быть легко адаптировано к другим взглядам и моделям:

#!/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.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_())

Чтобы получить требуемые результаты, всплывающее меню начато, нажав на заголовок и населено с уникальными ценностями для той колонки. Как только пункт во всплывающем меню отобран, стоимость передается, чтобы self.proxy.setFilterRegExp (filterString) и колонка, чтобы self.proxy.setFilterKeyColumn (filterValue) .

image

18
добавлено
Не получение любой вещи, фильтрованной, когда я печатаю "седло ряда 0 0" в коробке фильтра. я добавил заявления печати в on_lineEdit_textChanged on_comboBox_currentIndexChanged , но они никогда не выполняются. Я работаю над Пайтоном 2.6.4
добавлено автор Rao, источник
работавший, соединяя сигналы self.comboBox.currentIndexChanged.connect (сам on_comboBox_c‌ ​ urrentIndexChanged) и self.lineEdit.textChanged.connect (Сам on_lineEdit_textChang‌ ​ редактор) , Но мне нужны фильтры, которые будут показаны на заголовках столбцов, от того, где я могу выбрать его (например, как в, выделяются). я обновил вопрос с превосходить снимком, который требуется.
добавлено автор Rao, источник
можно ли отредактировать код для waht, который вы предложили. Я couldn' t способный найти заголовок щелкают по событию.
добавлено автор Rao, источник
я попробовал self.view.horizontalHeader.sectionClicked (self.headerclick) , но я получаю ошибку AttributeError: ' builtin_function_or_method' у объекта нет признака ' sectionClicked'
добавлено автор Rao, источник
добавлено автор Rao, источник
этот self.view.horizontalHeader() .sectionClicked.connect (сам hea‌ ​ derclick) работал, но как получить индекс столбца от него....?
добавлено автор Rao, источник
вопросы я спрашиваю об этой почте только... Ваш ответ не полностью закончен. таким образом, я получаю сомнения. Поэтому только я попросил, чтобы вы обновили свой ответ согласно вашему предложению. поскольку я - новичок в QTableview
добавлено автор Rao, источник
спасибо за помощь. я начну новую почту для своих дальнейших сомнений. На данный момент, если я фильтрую колонку 1 с седло ряда 0 0 и пытаюсь отфильтровать колонку 2, это должно показать только видимые уникальные значения колонки 2 (вероятно, это должно показать седло ряда 0 1 только), но теперь его показ всех элементов колонки 2 ( седло ряда 0 1 , седло ряда 1 1 , седло ряда 2 1 )
добавлено автор Rao, источник
@PBLNarasimhaRao Забыл соединять места! Я обновил код, это должно работать теперь
добавлено автор user1006989, источник
Контроль @PBLNarasimhaRao мой обновленный ответ, Я включил некоторую информацию, как показать всплывающее меню фильтра при нажатии на заголовок
добавлено автор user1006989, источник
@PBLNarasimhaRao сигнал, который вы ищете, sectionClicked (интервал logicalIndex)
добавлено автор user1006989, источник
Попытка @PBLNarasimhaRao это вместо этого self.view.horizontalHeader() .sectionClicked (self.headerclick)
добавлено автор user1006989, источник
@PBLNarasimhaRao sectionClicked возвращает число, которое является количеством колонки, пожалуйста, создайте новую почту для дальнейших вопросов постараться не расширять эту нить
добавлено автор user1006989, источник
Примечание @PBLNarasimhaRao, что мой ответ касается полностью вашего оригинального вопроса и что я shouldn' t отредактировали мой ответ, чтобы соответствовать ваши новые требования, новая почта должна была быть создана вместо этого, что-то как , Как сортировать в QTableView как в, выделяются . Я обновлю свой код, чтобы отразить изменения в вашем вопросе, хотя необходимо быть способны к написанию кода, вам нужно вашим собственным с подсказками, которые я дал вам, пожалуйста don' t ожидают кормиться с ложечки и полагать, что это имеет значение в ваших будущих вопросах в ТАК
добавлено автор user1006989, источник
Контроль @PBLNarasimhaRao мой обновленный ответ, Я отредактировал код, чтобы позволить сортировать в QTableView как в Excel
добавлено автор user1006989, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

Qt
Qt
703 участник(ов)

Группа взаимопомощи Qt.Делимся советами и помогаем друг другу. Наш информационный канал @ProQt Полезная информация для начинающих: #newcomer Познавательная информация: #fyi #didyouknow Наши друзья: Чат с/с++ @ProCxx

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community