QAction.setEnabled(False) 意外行为
QAction.setEnabled(False) unexpected behaviour
我已经确定禁用 QAction
实际上并不会阻止代码能够对其进行 运行 activate()
,这让我感到好奇。所以我想做一个辅助子类:
class DeactivatableAction(QtWidgets.QAction):
def activate(self, event):
if self.isEnabled():
super().activate(event)
在实践中,这似乎适用于我正在开发的应用程序。然后我想包括这个功能的测试(pytest):
@unittest.mock.patch('PyQt5.QtWidgets.QAction.activate')
def test_deactivatable_action_should_only_superactivate_if_enabled(mock_super):
import gen_fmwrk.deactivatable_action as d_action
QtWidgets.QApplication([]) # without this, I get a complaint about "Application not initialized"
da = d_action.DeactivatableAction()
da.setEnabled(False)
# da.setDisabled(True) - NB same effect as previous line
assert not da.isEnabled() # this fails!
da.activate(None)
assert not mock_super.called # this also fails
我意识到这是 运行 PyQt5 代码的一种无实体的方式...但我仍然希望能够像这样在 pytest 上下文中禁用 QAction。怎么回事,有解决办法吗?
问题是 QtWidgets.QApplication([])
未分配给变量,因此无法正确构造它,从而导致意外行为。改为
app = QtWidgets.QApplication([])
我已经确定禁用 QAction
实际上并不会阻止代码能够对其进行 运行 activate()
,这让我感到好奇。所以我想做一个辅助子类:
class DeactivatableAction(QtWidgets.QAction):
def activate(self, event):
if self.isEnabled():
super().activate(event)
在实践中,这似乎适用于我正在开发的应用程序。然后我想包括这个功能的测试(pytest):
@unittest.mock.patch('PyQt5.QtWidgets.QAction.activate')
def test_deactivatable_action_should_only_superactivate_if_enabled(mock_super):
import gen_fmwrk.deactivatable_action as d_action
QtWidgets.QApplication([]) # without this, I get a complaint about "Application not initialized"
da = d_action.DeactivatableAction()
da.setEnabled(False)
# da.setDisabled(True) - NB same effect as previous line
assert not da.isEnabled() # this fails!
da.activate(None)
assert not mock_super.called # this also fails
我意识到这是 运行 PyQt5 代码的一种无实体的方式...但我仍然希望能够像这样在 pytest 上下文中禁用 QAction。怎么回事,有解决办法吗?
问题是 QtWidgets.QApplication([])
未分配给变量,因此无法正确构造它,从而导致意外行为。改为
app = QtWidgets.QApplication([])