亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PyQT5 和使用多列篩選表

PyQT5 和使用多列篩選表

搖曳的薔薇 2022-08-11 17:12:51
我正在嘗試制作一個GUI來以表格的形式顯示Pandas數據幀,并提供列過濾選項,類似于Microsoft Excel過濾器。到目前為止,我設法采用了類似的SO答案。這是我在 GUI 中的表的圖片:PyQt5如上圖所示,有兩種方法可以過濾列:正則表達式過濾器和單擊每列。但是,有一個問題我需要幫助解決:當前應用的篩選器(正則表達式篩選器或列單擊)在篩選第二列時消失。我希望第二個過濾器為,即滿足列1列2的過濾器。ANDAND
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

如果要實現自定義篩選過程,則必須重寫 filterAcceptsRow 方法,獲取每列的文本并驗證它們是否滿足條件,如果它們確實返回 True,否則返回 False。若要重新計算篩選器,必須調用無效篩選器方法:


class CustomProxyModel(QtCore.QSortFilterProxyModel):

    def __init__(self, parent=None):

        super().__init__(parent)

        self._filters = dict()


    @property

    def filters(self):

        return self._filters


    def setFilter(self, expresion, column):

        if expresion:

            self.filters[column] = expresion

        elif column in self.filters:

            del self.filters[column]

        self.invalidateFilter()


    def filterAcceptsRow(self, source_row, source_parent):

        for column, expresion in self.filters.items():

            text = self.sourceModel().index(source_row, column, source_parent).data()

            regex = QtCore.QRegExp(

                expresion, QtCore.Qt.CaseInsensitive, QtCore.QRegExp.RegExp

            )

            if regex.indexIn(text) == -1:

                return False

        return True

class myWindow(QtWidgets.QMainWindow):

    # ...


    def load_sites(self):

        # ...


        self.model = PandasModel(df)

        self.proxy = CustomProxyModel(self)

        self.proxy.setSourceModel(self.model)

        self.view.setModel(self.proxy)

        self.view.resizeColumnsToContents()

        print("finished loading sites")


    # ...


    @QtCore.pyqtSlot()

    def on_actionAll_triggered(self):

        filterColumn = self.logicalIndex

        self.proxy.setFilter("", filterColumn)


    @QtCore.pyqtSlot(int)

    def on_signalMapper_mapped(self, i):

        stringAction = self.signalMapper.mapping(i).text()

        filterColumn = self.logicalIndex

        self.proxy.setFilter(stringAction, filterColumn)


    @QtCore.pyqtSlot(str)

    def on_lineEdit_textChanged(self, text):

        self.proxy.setFilter(text, self.proxy.filterKeyColumn())


    @QtCore.pyqtSlot(int)

    def on_comboBox_currentIndexChanged(self, index):

        self.proxy.setFilterKeyColumn(index)

加:如果要更改 QHeaderView 的字體,則必須在 headerData 中返回該字體,如下所示:


class PandasModel(QtCore.QAbstractTableModel):

    def __init__(self, df=pd.DataFrame(), parent=None):

        QtCore.QAbstractTableModel.__init__(self, parent=parent)

        self._df = df.copy()

        self.bolds = dict()


    def toDataFrame(self):

        return self._df.copy()


    def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):

        if orientation == QtCore.Qt.Horizontal:

            if role == QtCore.Qt.DisplayRole:

                try:

                    return self._df.columns.tolist()[section]

                except (IndexError,):

                    return QtCore.QVariant()

            elif role == QtCore.Qt.FontRole:

                return self.bolds.get(section, QtCore.QVariant())

        elif orientation == QtCore.Qt.Vertical:

            if role == QtCore.Qt.DisplayRole:

                try:

                    # return self.df.index.tolist()

                    return self._df.index.tolist()[section]

                except (IndexError,):

                    return QtCore.QVariant()

        return QtCore.QVariant()


    def setFont(self, section, font):

        self.bolds[section] = font

        self.headerDataChanged.emit(QtCore.Qt.Horizontal, 0, self.columnCount())

    # ...

class myWindow(QtWidgets.QMainWindow):

    # ...

   @QtCore.pyqtSlot()

    def on_actionAll_triggered(self):

        filterColumn = self.logicalIndex

        self.proxy.setFilter("", filterColumn)

        font = QtGui.QFont()

        self.model.setFont(filterColumn, font)


    @QtCore.pyqtSlot(int)

    def on_signalMapper_mapped(self, i):

        stringAction = self.signalMapper.mapping(i).text()

        filterColumn = self.logicalIndex

        self.proxy.setFilter(stringAction, filterColumn)

        font = QtGui.QFont()

        font.setBold(True)

        self.model.setFont(filterColumn, font)


查看完整回答
反對 回復 2022-08-11
  • 1 回答
  • 0 關注
  • 532 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號