Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为正在启用/禁用的项目(QTableWidget)设置事件处理程序?_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何为正在启用/禁用的项目(QTableWidget)设置事件处理程序?

Python 如何为正在启用/禁用的项目(QTableWidget)设置事件处理程序?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个QTableWidget,它根据特定数据启用和禁用 我有一个按钮,我想在QTableWidget启用时启用,在widget禁用时禁用 是否有任何事件处理程序允许我这样做? 例如(这不起作用): 理想情况下,在上述代码中,每次启用或禁用表时都会打印“test”。最简单的解决方案是,在停用QTableWidget时,也会停用按钮(或使用信号传输信息) 相反,另一个解决方案是使用一个事件过滤器,允许在小部件的状态每次更改时发出信号,然后使用该信息更改按钮的状态 随机导入 导入系统 从PyQt5

我有一个QTableWidget,它根据特定数据启用和禁用

我有一个按钮,我想在QTableWidget启用时启用,在widget禁用时禁用

是否有任何事件处理程序允许我这样做? 例如(这不起作用):


理想情况下,在上述代码中,每次启用或禁用表时都会打印“test”。

最简单的解决方案是,在停用QTableWidget时,也会停用按钮(或使用信号传输信息)

相反,另一个解决方案是使用一个事件过滤器,允许在小部件的状态每次更改时发出信号,然后使用该信息更改按钮的状态

随机导入
导入系统
从PyQt5导入QtCore、QtWidgets
类EnableHelper(QtCore.QObject):
enableChanged=QtCore.pyqtSignal(bool)
定义初始化(自我,小部件):
super()。\uuuu初始化(小部件)
self.\u widget=widget
self.widget.installEventFilter(self)
@财产
def小部件(自身):
返回self.\u小部件
def事件过滤器(自身、obj、事件):
如果obj是self.widget和event.type()==QtCore.QEvent.EnabledChange:
self.enableChanged.emit(self.widget.isEnabled())
return super().eventFilter(对象,事件)
类小部件(qtwidts.QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.table=qtwidts.QTableWidget(5,4)
self.button=qtwidts.QPushButton(“你好世界”)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.table)
lay.addWidget(self.button)
helper=enablehlper(self.table)
helper.enableChanged.connect(self.button.setEnabled)
self.test()
def测试(自我):
self.table.setEnabled(random.choice([True,False]))
QtCore.QTimer.singleShot(1000,自测试)
def main():
app=qtwidts.QApplication(sys.argv)
win=Widget()
win.show()
ret=app.exec
系统退出(ret)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

注意:changeEvent不是信号,因此不应使用connect,因为这是类方法。另外,如果您只想检测小部件的状态是否从启用变为禁用,或者从禁用变为启用,那么使用它也不好,因为这在其他情况下也会被调用。

最简单的解决方案是,当您停用QTableWidget时,您也会停用按钮(或使用信号传输信息)

相反,另一个解决方案是使用一个事件过滤器,允许在小部件的状态每次更改时发出信号,然后使用该信息更改按钮的状态

随机导入
导入系统
从PyQt5导入QtCore、QtWidgets
类EnableHelper(QtCore.QObject):
enableChanged=QtCore.pyqtSignal(bool)
定义初始化(自我,小部件):
super()。\uuuu初始化(小部件)
self.\u widget=widget
self.widget.installEventFilter(self)
@财产
def小部件(自身):
返回self.\u小部件
def事件过滤器(自身、obj、事件):
如果obj是self.widget和event.type()==QtCore.QEvent.EnabledChange:
self.enableChanged.emit(self.widget.isEnabled())
return super().eventFilter(对象,事件)
类小部件(qtwidts.QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.table=qtwidts.QTableWidget(5,4)
self.button=qtwidts.QPushButton(“你好世界”)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.table)
lay.addWidget(self.button)
helper=enablehlper(self.table)
helper.enableChanged.connect(self.button.setEnabled)
self.test()
def测试(自我):
self.table.setEnabled(random.choice([True,False]))
QtCore.QTimer.singleShot(1000,自测试)
def main():
app=qtwidts.QApplication(sys.argv)
win=Widget()
win.show()
ret=app.exec
系统退出(ret)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

注意:changeEvent不是信号,因此不应使用connect,因为这是类方法。另外,如果您只想检测小部件的状态是否从启用变为禁用,或者从禁用变为启用,那么使用它是不好的,因为这在其他情况下也会被调用。

既然您已经在自己启用/取消消噪,您就不能为它创建一个信号并发出它吗?我可以,但它比我描述的基本情况稍微多一些。这只会让代码变得更混乱,我试图避免这种情况。既然你已经在自己启用/去模糊,你就不能为它创建一个信号并发出它吗?我可以,但它比我描述的基本情况要复杂一些。这只会让代码变得更加混乱,我正试图避免这种情况。
    myTable.changeEvent.connect(lambda: print("test"))