QAction.isChecked() 始终为 False,即使在初始化时已将其设置为 True

QAction.isChecked() always False, even after it has been set to True at init

我有一个 PyQt5 应用程序,它的主要 window 上有 QDockWidgets,我有一个包含列出的这些 dockwidgets 的菜单。每当我单击菜单项时,我希望根据单击时是否选中菜单项来关闭或打开该小部件。

我在初始化时检查菜单项是这样的:

self.stream_action = QAction('Stream')
self.stream_action.setCheckable(True)
self.stream_action.setChecked(True)
self.stream_action.triggered.connect(self.show_hide_widget)

我对其他人也这样做,当 GUI 启动时它看起来像这样:

所以当我点击其中一个时,我们跳转到 show_hide_widget 函数,它看起来像这样:

def show_hide_widget(self):
    widget_id = self.sender().text()
    if self.sender().isChecked():
        self.sender().setChecked(False)
        if widget_id == 'Stream':
            self.dock_stream.close()
    else:
        self.sender().setChecked(True)
        if widget_id == 'Stream':
            self.dock_stream.show()

但是 self.sender().isChecked() 给了我 False,这是为什么?

每当可检查的操作是 triggered 时,它的检查状态也会切换。

注释掉那个功能,尝试再次触发动作,你会看到:当你第一次看到它时,它是被选中的,但是通过点击它你也会切换它的状态(即使你看不到结果,因为它会立即消失)。再次打开菜单,您会发现该操作现在未选中,再次触发它,您的功能将按您预期的方式运行。

这显然意味着你不应该在show_hide_widget函数中设置动作的检查状态。

此外,考虑实现触发的 checked 参数,这是比调用 self.sender().

更好的选择
def show_hide_widget(self, state):
    print(state)