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)
我有一个 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)