У меня есть два пользовательских класса QMenuBar MyMenuBar0
и MyMenuBar1
, и я хочу переключаться с одной строки меню на другую при нажатии кнопки.Проблема, показанная ниже, заключается в том, что нажатие кнопки приводит к исчезновению меню.Как настроить, чтобы кнопка могла переключаться между меню?
Пример 1 (рабочий пример, без использования кнопки)
Когда строки менюизменено как часть метода __init__
главного окна, все работает нормально.
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.setMenuBar( MyMenuBar0(self) ) #first menu bar set
self.change_menu_bar() #successful change to the second menu bar
def change_menu_bar(self):
self.setMenuBar( MyMenuBar1(self) )
Пример 2 (пример проблемы, при попытке использовать кнопку)
Когдаповторяя вышеупомянутое с кнопкой, нажатие кнопки приводит к исчезновению меню.
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.setMenuBar( MyMenuBar0(self) )
button = QtWidgets.QPushButton(self)
button.clicked.connect( self.button_change_menu_bar )
def button_change_menu_bar(self, a):
self.setMenuBar( MyMenuBar1(self) ) #causes the menu bar to disappear
Вот полный код для воспроизведения проблемы:
Пример 1
import sys
from PyQt5 import QtWidgets
class MyMenuBar0(QtWidgets.QMenuBar):
def __init__(self, parent):
super().__init__(parent)
menu = self.addMenu('Menu 0')
action0 = QtWidgets.QAction('Action 0', self)
action1 = QtWidgets.QAction('Action 1', self)
menu.addAction(action0)
menu.addAction(action1)
class MyMenuBar1(QtWidgets.QMenuBar):
def __init__(self, parent):
super().__init__(parent)
menu = self.addMenu('Menu 1')
action0 = QtWidgets.QAction('Action 2', self)
action1 = QtWidgets.QAction('Action 3', self)
menu.addAction(action0)
menu.addAction(action1)
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.setMenuBar( MyMenuBar0(self) ) #first menu bar set
self.change_menu_bar() #successful change to the second menu bar
def change_menu_bar(self):
self.setMenuBar( MyMenuBar1(self) )
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyMainWindow()
window.show()
sys.exit(app.exec_())
Пример 2
import sys
from PyQt5 import QtWidgets
class MyMenuBar0(QtWidgets.QMenuBar):
def __init__(self, parent):
super().__init__(parent)
menu = self.addMenu('Menu 0')
action0 = QtWidgets.QAction('Action 0', self)
action1 = QtWidgets.QAction('Action 1', self)
menu.addAction(action0)
menu.addAction(action1)
class MyMenuBar1(QtWidgets.QMenuBar):
def __init__(self, parent):
super().__init__(parent)
menu = self.addMenu('Menu 1')
action0 = QtWidgets.QAction('Action 2', self)
action1 = QtWidgets.QAction('Action 3', self)
menu.addAction(action0)
menu.addAction(action1)
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self, *args):
super().__init__(*args)
self.setMenuBar( MyMenuBar0(self) )
button = QtWidgets.QPushButton(self)
button.clicked.connect( self.button_change_menu_bar )
def button_change_menu_bar(self, a):
self.setMenuBar( MyMenuBar1(self) ) #causes the menu bar to disappear
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyMainWindow()
window.show()
sys.exit(app.exec_())