【发布时间】:2019-06-05 09:43:42
【问题描述】:
我有两个自定义 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_())
【问题讨论】:
-
尝试将
button = QtWidgets.QPushButton(self)更改为central_widget = QtWidgets.QWidget() self.setCentralWidget(central_widget) button = QtWidgets.QPushButton(central_widget) -
我试过了,但并没有解决问题。菜单仍然消失。
标签: python python-3.x macos pyqt pyqt5