慕容3067478
如果要实现自定义筛选过程,则必须重写 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 Trueclass 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)