第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

PyQT5 和使用多列篩選表

PyQT5 和使用多列篩選表

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

1 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果要實(shí)現(xiàn)自定義篩選過(guò)程,則必須重寫(xiě) filterAcceptsRow 方法,獲取每列的文本并驗(yàn)證它們是否滿足條件,如果它們確實(shí)返回 True,否則返回 False。若要重新計(jì)算篩選器,必須調(diào)用無(wú)效篩選器方法:


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)


查看完整回答
反對(duì) 回復(fù) 2022-08-11
  • 1 回答
  • 0 關(guān)注
  • 523 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)