一次只能选中一个QAction在QMenu中可检查。

3

我正在尝试将QMenu中的选项设置为可选中,以便一次只能选择一个并默认选中第一个选项(实际上这是有效的)。

以下是我的一小段代码:

paymentType = QMenu('Payment Type', self)
paymentType.addAction(QAction('Cash', paymentType, checkable=True, checked = True))
paymentType.addAction(QAction('Noncash Payment', paymentType, checkable=True))
paymentType.addAction(QAction('Cash on Delivery', paymentType, checkable=True))
paymentType.addAction(QAction('Bank Transfer', paymentType, checkable=True))
menu.addMenu(paymentType)

有什么建议吗?谢谢!
1个回答

6

一个可能的选择是使用QActionGroup并激活exclusive属性。

import sys
from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self, *args, **kwargs)
        menu = self.menuBar()
        paymentType = QMenu('Payment Type', self)
        group = QActionGroup(paymentType)
        texts = ["Cash", "Noncash Payment", "Cash on Delivery", "Bank Transfer"]
        for text in texts:
            action = QAction(text, paymentType, checkable=True, checked=text==texts[0])
            paymentType.addAction(action)
            group.addAction(action)
        group.setExclusive(True)
        group.triggered.connect(self.onTriggered)
        menu.addMenu(paymentType)

    def onTriggered(self, action):
        print(action.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

有没有办法将self.menuBar()作为QMainWindow类的属性而不是创建QMenuBar进行操作?如果可以,实现会像这样:menu = self.menuBar()然后随后menu.addMenu(paymentType)吗?我尝试了这个方法,但好像不能工作?谢谢 - New2coding
@New2Python,这对我来说很奇怪,我已经使用QMainWindow放置了一个示例,并且它可以正常工作。如果即使使用示例也有问题,那么我需要您展示一段我可以使用的代码。 - eyllanesc
你说得对,我在那个上下文中漏掉了QMenu()的self参数。现在它可以工作了。谢谢! - New2coding
有什么建议可以检索isChecked()信息吗?想象一下,当用户希望将其默认设置为现金并因此不触发按钮的情况,但在其他事件中,我们需要提取此信息并检索选中的项目。谢谢。 - New2coding
1
如果你已经了解了QActionGroup,它有一个方法叫做checkedAction,它返回当前被选中的QAction。我建议你在提问前先阅读文档。 :D - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接