Как я могу использовать кнопку для переключения между двумя строками меню в PyQt5? Панель меню исчезает - PullRequest
0 голосов
/ 05 июня 2019

У меня есть два пользовательских класса 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_())

1 Ответ

0 голосов
/ 07 июня 2019

Вы хотите поместить оба меню в метод setUI и упростить свой код. Это может работать для вас.

class MyMainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args):
        super().__init__(*args)
        self.setUI()

    def setUI(self):
        self.MenuBar0 = QMenuBar()
        # ...
        self.menuBar1 = QMenuBar()
        # ...
        button  = QPushButton('Toggle')
        button.clicked.connect( self.button_change_menu_bar )

    def button_change_menu_bar(self):
        state = self.menuBar0.isVisible()
        self.menuBar0.setVisible(not state)
        self.menuBar1.setVisible(state)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...