Как не закрывать QMenuBar при клике?

Есть скрипт, в котором добавлен QActionGroup в MenuBar с множественным выбором.

При работе надо будет отмечать галочками какие-то пункты. Сейчас, все работает хорошо, но при клике меню закрывается.

В итоге, если требуется снять галку с 7 из 8 пунктов, надо каждый раз кликать на меню и выбирать нужный вариант.

Как можно сделать, чтоб меню закрывалось только при клике мимо него, а при клике на пункте из меню оно оставалось открытым?

MainWindow

import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QActionGroup, QAction, QMenuBar, QGridLayout


def init_menubar(self):
    menu_bar = QMenuBar(self)
    self.setMenuBar(menu_bar)
    checkbox_menu = menu_bar.addMenu('&Test')
    checkbox_group = QActionGroup(self)
    checkbox_group.setExclusive(False)

    a = checkbox_group.addAction(QAction("1", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("2", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("3", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("4", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("5", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("6", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("7", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)
    a = checkbox_group.addAction(QAction("8", self, checkable=True))
    a.setChecked(True)
    checkbox_menu.addAction(a)


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setFixedSize(500, 270)
        self.setWindowTitle("Test")
        self.centralWidget = QWidget(self)
        self.centralWidget.setFixedSize(500, 250)
        self.grid = QGridLayout(self.centralWidget)
        self.setCentralWidget(self.centralWidget)

        init_menubar(self)
        

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

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.Qt import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget(self)
        self.setCentralWidget(self.centralWidget)

        button = QPushButton("Click me")
        button.clicked.connect(self.onClicked)
        self.label = QLabel()

        grid = QGridLayout(self.centralWidget)
        grid.addWidget(self.label, 0, 0, alignment=Qt.AlignCenter)
        grid.addWidget(button, 1, 0, alignment=Qt.AlignBottom)

        self.init_menubar()
        
    def init_menubar (self):        
        mainMenu = self.menuBar()
        mainMenu.setNativeMenuBar(False)
        self.toolMenu = mainMenu.addMenu('&Test')

        self._checkBoxs = []
        for i in range(9):    
            checkBox = QCheckBox(str(i+1), self.toolMenu)
            checkableAction = QWidgetAction(self.toolMenu)
            checkableAction.setDefaultWidget(checkBox) 
            self._checkBoxs.append(checkBox)
            self.toolMenu.addAction(checkableAction)
           
    def onClicked(self):
        _listCb  = [f'checkBox: {ch.text()} - {ch.isChecked()}' for ch in self._checkBoxs ]
        self.label.setText('\n'.join(_listCb))
    

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(500, 270)
    window.setWindowTitle("Test")
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка