Как не закрывать QMenuBar при клике?
Есть скрипт, в котором добавлен QActionGroup в MenuBar с множественным выбором.
При работе надо будет отмечать галочками какие-то пункты. Сейчас, все работает хорошо, но при клике меню закрывается.
В итоге, если требуется снять галку с 7 из 8 пунктов, надо каждый раз кликать на меню и выбирать нужный вариант.
Как можно сделать, чтоб меню закрывалось только при клике мимо него, а при клике на пункте из меню оно оставалось открытым?
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_())

