Python 如何使用按钮启用和禁用QHeaderView过滤器

Python 如何使用按钮启用和禁用QHeaderView过滤器,python,pyqt,pyqt5,qtableview,qheaderview,Python,Pyqt,Pyqt5,Qtableview,Qheaderview,关于@Ekhumaro和@Oak_326048和@eyllanesc的great,我希望首先在QHeaderView下方有一个没有过滤器的正常视图,并有一个按钮来激活(显示)过滤器: 单击过滤器按钮(其中包含property button.setCheckable(True))后,我希望获得: 注意:过滤器按钮已按下。现在,当我再次单击“过滤”按钮(取消按下按钮)时,我希望QHeaderView下方带有过滤器的行消失: 我如何才能做到这一点,换句话说,如何使QTableView的QHead

关于@Ekhumaro和@Oak_326048和@eyllanesc的great,我希望首先在QHeaderView下方有一个没有过滤器的正常视图,并有一个按钮来激活(显示)过滤器:

单击过滤器按钮(其中包含property button.setCheckable(True))后,我希望获得:

注意:过滤器按钮已按下。现在,当我再次单击“过滤”按钮(取消按下按钮)时,我希望QHeaderView下方带有过滤器的行消失:

我如何才能做到这一点,换句话说,如何使QTableView的QHeaderView成为旧的普通视图?这将是非常方便的,在应用程序中有这样一种功能,用户可以随时用按钮(或任何其他方式)切换QHeaderView下面的过滤器行。应用程序的行为是,当按钮未按下且过滤器行消失时,取消视图中的所有过滤器,但这对于这个问题并不重要

编辑: 以下是MRE:

导入系统 从PyQt5.QtCore导入pyqtSignal,Qt 从PyQt5.QtGui导入QStandardItemModel、QStandardItem 从PyQt5.QtWidgets导入( QHeaderView, QWidget, QLineEdit, QApplication, QTableView, QVBoxLayout, QHBoxLayout, QComboBox, QPushButton, QCheckBox, QMessageBox, ) 类小部件(QWidget): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.btn=QPushButton() self.btn.setText(“=”) 自身btn设置固定宽度(20) self.linee=QLineEdit() self.linee.setPlaceholderText(“过滤器”) lay=QHBoxLayout(自) lay.setContentsMargins(0,0,0,0) 设置间距(0) lay.addWidget(self.btn) lay.addWidget(self.linee) 类别过滤器标题(QHeaderView): filterActivated=pyqtSignal() 定义初始化(自身,父级): super() self._编辑器=[] 自填充=4 自整定拉伸截面(真) #self.setResizeMode(QHeaderView.Stretch) self.setDefaultAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.setSortIndicator显示(假) 自调整截面尺寸连接(自调整位置) parent.horizontalScrollBar().valueChanged.connect(自调整位置) def设置过滤器盒(自身,计数): 而self.\u编辑: editor=self.\u editors.pop() editor.deleteLater() 对于范围内的索引(计数): editor=self.create\u编辑器(self.parent(),索引) self.\u editors.append(编辑器) 自我调整位置() def创建编辑器(自身、父项、索引): 如果索引=1:#空 编辑器=QWidget()
elif index==2:#数字过滤器(>|=|您必须创建一个处理编辑器可见性的属性:

class FilterHeader(QHeaderView):
filterActivated=pyqtSignal()
定义初始化(自身,父级):
super()
self.\u visible\u editors=False
self._编辑器=[]
自填充=4
自整定拉伸截面(真)
#self.setResizeMode(QHeaderView.Stretch)
self.setDefaultAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.setSortIndicator显示(假)
自调整截面尺寸连接(自调整位置)
parent.horizontalScrollBar().valueChanged.connect(自调整位置)
@财产
def可见编辑器(自身):
返回self.\u可见\u编辑器
@可见编辑器.setter
def可见编辑器(自身,是否可见):
self.\u visible\u editors=是否可见
对于自我编辑器。\u编辑器:
编辑器.setVisible(self.visible\u编辑器)
self.updategeometrics()
def设置过滤器盒(自身,计数):
而self.\u编辑:
editor=self.\u editors.pop()
editor.deleteLater()
对于范围内的索引(计数):
editor=self.create\u编辑器(self.parent(),索引)
编辑器.setVisible(self.visible\u编辑器)
self.\u editors.append(编辑器)
自我调整位置()
def创建编辑器(自身、父项、索引):
如果索引=1:#空
编辑器=QWidget()

elif index==2:#数字过滤器(>|=|这不是完整的MRE,当我添加程序的其余部分(类小部件(QWidget)和main)时它不工作,当我在启动程序后立即关闭应用程序时,它挂起(不关闭)。@eyllanesc,你能发布一个完整的程序吗。@nenad 1)我已经为我的完整代码创建了一个要点,我不会用不必要的代码填充我的答案:2)创建一个没有任何影响的问题只是噪音,请避免它。3) 每次你接受一个答案时,你都必须对它进行测试,因为如果OP在前一天指出它有效,那么必须注意一个老问题是很烦人的。对不起,如果可以的话,我可以删除另一个问题。问题是,当我在启动程序后立即关闭程序时,gist中的代码仍然挂起(在开始时我没有注意到)。有趣的是,如果我单击一个过滤器按钮,然后关闭程序,它会关闭ok。@nenad 1)您的环境是什么:Python版本、PyQt5版本、OS等,2)您在哪里执行命令?尝试从CMD启动,避免使用IDEs1)Python 3.8.3、PyQt5==5.13.2、Win7 2)CMD.exe命令行。请不要麻烦它是否适合您(在您的平台上),因为这样我就知道代码是可以的,我可以尝试它并在其他平台上测试它。
def closeEvent(self, event):
    self.view.horizontalHeader().visible_editors = False