Одно действие QAction, доступное для проверки в QMenu

Я пытаюсь сделать свой выбор из 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)

Какие-либо предложения? Спасибо!


person New2coding    schedule 25.01.2018    source источник


Ответы (1)


Возможный вариант — использовать 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_())
person eyllanesc    schedule 25.01.2018
comment
Есть ли способ использовать self.menuBar() как свойство класса QMainWindow вместо создания QMenuBar? Если это так, реализация будет выглядеть примерно так: menu = self.menuBar() и, следовательно, menu.addMenu(paymentType)? Я попробовал это, и это, кажется, не работает? Спасибо - person New2coding; 25.01.2018
comment
@New2Python Мне это кажется странным, я разместил пример с использованием QMainWindow, и он работает правильно, если даже с этим примером возникнут проблемы, мне нужно, чтобы вы показали код, который я могу использовать. - person eyllanesc; 25.01.2018
comment
Вы правы, я пропустил собственный аргумент QMenu() в этом контексте. Теперь это работает. Спасибо! - person New2coding; 25.01.2018
comment
Любое предложение, как получить информацию isChecked()? Представьте себе случай, когда пользователь хочет, чтобы по умолчанию для него были установлены наличные деньги, и поэтому кнопка не срабатывала, однако в другом случае нам нужно было бы извлечь эту информацию и получить отмеченный элемент. Спасибо - person New2coding; 26.01.2018
comment
@New2Python Если вы читали о QActionGroup, у него есть метод checkedAction , это возвращает выбранное действие QAction. Я рекомендую вам прочитать документы, прежде чем спрашивать. :D - person eyllanesc; 26.01.2018