Как сделать поведение action checkable пунктов меню окна подобным radiobutton?

Рейтинг: 0Ответов: 1Опубликовано: 09.03.2023

Может быть формулировка вопроса не очень очевидная (собственно, поэтому я это и не смог нагуглить), но постараюсь изложить это своими словами. У меня есть такой кусок кода:

def create_menu_bar(self):
    menu_bar = self.menuBar()
    file_menu = QMenu("&File", self)
    settings_menu = QMenu("&Settings", self)
    # подменю настроек
    profiles_menu = QMenu("&Profiles", self)
    profiles_menu.setIcon(QIcon('img/profiles.png'))

    # основные пункты меню
    menu_bar.addMenu(file_menu)
    menu_bar.addMenu(settings_menu)

    # подпункты в file_menu
    export_configs = self.create_export_configs_action()
    exit_action = self.create_exit_action()
    file_menu.addAction(export_configs)
    file_menu.addAction(exit_action)

    # TODO: тестовые профили
    action_profile_1 = QAction('Profile 1', self)
    action_profile_2 = QAction('Profile 2', self)
    settings_menu.addAction(profiles_menu.menuAction())
    profiles_menu.addAction(action_profile_1)
    profiles_menu.addAction(action_profile_2)
    action_profile_1.setCheckable(True)
    action_profile_2.setCheckable(True)

Я хочу сделать выбор профилей с определенными настройками программы (иными словами пресеты). И было бы очень кстати воткнуть их в главное меню окна, то есть верхнюю панель с пунктами Файл, Редактировать, и тд. В пункте "settings" у меня есть подпункт Profiles, и по моей задумке при его открытии выпадает список профилей, которые я реализовал через QAction. Я нашел один интересный метод: "setCheckable", который позволяет мне выбирать их и рядом появляется галочка. Единственная проблема, что это работает как checkbox, и можно выбирать сразу несколько пунктов, а мне бы хотелось, чтобы это работало как radiobutton. Т.е. чтобы можно было выбрать лишь один из этих пунктов. Можно ли реализовать это таким образом?

PS: ручками конечно можно логику такую прописать, но я предполагаю, что это будет изобретением велосипеда

Ответы

▲ 1Принят

Попробуйте таким способом

def create_menu_bar(self):
    menu_bar = self.menuBar()
    file_menu = QMenu("&File", self)
    settings_menu = QMenu("&Settings", self)

    # подменю настроек
    profiles_menu = QMenu("&Profiles", self)
    profiles_menu.setIcon(QIcon('img/profiles.png'))
    profiles_group = QActionGroup(self)

    # основные пункты меню
    menu_bar.addMenu(file_menu)
    menu_bar.addMenu(settings_menu)

    # подпункты в file_menu
    export_configs = self.create_export_configs_action()
    exit_action = self.create_exit_action()
    file_menu.addAction(export_configs)
    file_menu.addAction(exit_action)

    # добавляем радиокнопки в подменю profiles_menu
    action_profile_1 = QAction('Profile 1', self, checkable=True)
    action_profile_2 = QAction('Profile 2', self, checkable=True)
    profiles_menu.addAction(action_profile_1)
    profiles_menu.addAction(action_profile_2)

    # добавляем радиокнопки в QActionGroup, чтобы они работали как группа
    profiles_group.addAction(action_profile_1)
    profiles_group.addAction(action_profile_2)

    # добавляем подменю в settings_menu
    settings_menu.addMenu(profiles_menu)