从QActionGroup获取选定的QAction文本标签

时间:2017-12-07 09:42:02

标签: python-2.7 pyqt pyqt5

所以我正在尝试创建一个包含选项列表的PyQt设置选项卡,其中我只能选择一个选项列表中的一个选项。然后应将所选选项的标签(例如“A”)复制到self.ID变量,以便它可以用作后续函数的变量。以下是我在 init 函数中编写的内容:

    self.ID = 0
    self.prevMenu = QtWidgets.QMenu('ID tag', self)
    ag = QtWidgets.QActionGroup(self.prevMenu, exclusive=True)
    self.myID = ['A','B','C','D','E']

    for i in self.myID:
        Action = ag.addAction(QtWidgets.QAction(i, self.prevMenu, checkable=True))
        self.prevMenu.addAction(Action)
        Action.setText(i)
        Action.triggered.connect(lambda item=Action.text(): self.set_ID(Action.text()))
    self.menubar.addMenu(self.prevMenu)

    def set_ID(self, ID):
       print "Which: ", ID
       self.ID = ID
       print self.ID

现在我的问题是,当我运行它时,无论我选择哪个标签,它只是列表的最后一个元素('E'),它被转移到self.ID.我知道它必须是关于我的变量如何从彼此继承的东西,但我无法弄清楚如何。有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个错误。

  1. triggered信号具有checked个参数,这意味着您使用的“item”参数将被触发的已检查状态“覆盖”。
  2. lambda函数的范围不是函数本身的内部函数,您需要实际引用该值(可能是类属性)或将其作为lambda可选参数传递。当使用for / while循环时,这非常很重要。
  3. 您应该将for周期的最后一行更改为:

    Action.triggered.connect(lambda checked, item=Action: self.set_ID(item.text())
    

    作为个人注释,如果您仅为此目的使用set_ID方法,您可能更喜欢将操作用作参数(并从方法中读取其文本),或者最终忽略完全参数并使用QObject.sender()函数来检索触发信号的动作。