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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QAction.isChecked()始终为False,即使在初始化时已将其设置为True相关的知识,希望对你有一定的参考价值。

我有一个PyQt5应用程序,它的主窗口上有QDockWidgets,我有一个菜单,其中包含列出的这些dockwidget。每当我单击菜单项时,我都希望关闭或打开该小部件,具体取决于单击时是否选中了该菜单项。

我这样检查init的菜单项:

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启动时看起来像这样:

enter image description here

因此,当我单击其中一个时,我们跳到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()给我错误,这是为什么?

答案

[可检查动作为triggered时,其检查状态也被切换。

注释该功能,尝试再次触发该动作,您会看到:第一次看到该动作时,它会被选中,但是通过单击它,您还会切换其状态(即使您没有查看结果,因为它立即消失了)。再次打开菜单,您将取消选中该操作,再次触发它,您的功能将按您预期的方式工作。

这显然意味着您不应该在show_hide_widget功能中设置动作的检查状态。

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

def show_hide_widget(self, state):
    print(state)

以上是关于QAction.isChecked()始终为False,即使在初始化时已将其设置为True的主要内容,如果未能解决你的问题,请参考以下文章

stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash

stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash

stm32f103的 RT-Thread3.1.3移植SFUD+FAL+EasyFlash

RTT+stm32f107移植FAL组件

TYPO3 Fluidcontent:如何在对象内使用 FAL

如何使用contextId使用'CLASS_NAME'查找'找到'android.widget.TextView':''multiple:fal