首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWidgetAction在使用setDefaultWidget到QCheckBox时检查状态不更改

QWidgetAction在使用setDefaultWidget到QCheckBox时检查状态不更改
EN

Stack Overflow用户
提问于 2020-01-23 19:01:16
回答 1查看 294关注 0票数 0

我想要创建一个带有可检查列表的菜单。为了防止菜单在单击操作时关闭,我将DefaultWidget设置为QCheckBox。问题是,当我试图从操作中获得isClicked时,它似乎没有被同步到复选框。单击复选框时,如何获得要更改的操作的值?

代码语言:javascript
复制
tool_button = QtWidgets.QToolButton()
menu = QtWidgets.QMenu()

check_box = QtWidgets.QCheckBox(menu)
check_box.setText("abc")
check_box.setChecked(True)
action_button = QtWidgets.QWidgetAction(menu)
action_button.setDefaultWidget(check_box)

menu.addAction(action_button)
tool_button.setMenu(menu)

print(check_box.text()) # returns abc
print(check_box.isChecked()) # returns True
print(action_button.isChecked()) # returns False - it's not picking up the values from check_box
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-23 20:49:17

由于QWidgetAction充当任何类型小部件的某种容器,因此它无法知道它的defaultWidget是否能够支持像"isChecked“这样的bool状态,所以您必须提供它。

最简单的方法是为该操作子类一个特定的QWidgetAction类,并重写它的isChecked()方法,以便它根据其默认小部件返回选中的值。

代码语言:javascript
复制
from PyQt5 import QtWidgets

class CheckableWidgetAction(QtWidgets.QWidgetAction):
    def setDefaultWidget(self, widget):
        super().setDefaultWidget(widget)
        try:
            # if the widget has the toggled signal, connect that signal to the
            # triggered signal
            widget.toggled.connect(self.triggered)
        except:
            pass

    def isChecked(self):
        try:
            return self.defaultWidget().isChecked()
        except:
            # failsafe, in case no default widget has been set or the provided
            # widget doesn't have a "checked" property
            return super().isChecked()


class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        tool_button = QtWidgets.QToolButton()
        layout.addWidget(tool_button)
        menu = QtWidgets.QMenu()

        check_box = QtWidgets.QCheckBox(menu)
        check_box.setText("abc")
        check_box.setChecked(True)
        self.action_button = CheckableWidgetAction(menu)
        self.action_button.setDefaultWidget(check_box)
        self.action_button.triggered.connect(self.action_triggered)

        menu.addAction(self.action_button)
        tool_button.setMenu(menu)

        controlButton = QtWidgets.QPushButton('is checked?')
        layout.addWidget(controlButton)
        controlButton.clicked.connect(self.is_checked)

    def is_checked(self):
        print('checked is {}'.format(self.action_button.isChecked()))

    def action_triggered(self, state):
        print('triggered {}'.format(state))

if __name__ == '__main__':
    import sys
    a = QtWidgets.QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(a.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59885469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档