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([])