PyQt 在菜单栏上选择项目会加载新的 frame/set 小部件

PyQt selecting items on a menu bar loads a new frame/set of widgets

我在 PyQt5 中有一个菜单栏, 每当我按下 'selection1' 时,应该会出现与 selection1 相对应的一组小部件 当我按下 'selection2' 时,应出现与选择 2

相对应的一组不同的小部件

没有找到现有线程,也没有实现它的线索。

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction


class Main(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        selection1 = QAction('selection1', self)
        selection1.triggered.connect(self.selection_1_widgets) # displays a set of widgets

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('menu')
        fileMenu.addAction(selection1)
        fileMenu.addAction('selection2')

        self.setGeometry(300, 300, 300, 200)
        self.show()

    def selection_1_widgets(self):
        pass

def main():
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

如果我没理解错的话,请注意QStackedWidget

The QStackedWidget class provides a stack of widgets where only one widget is visible at a time.

More https://doc.qt.io/qt-5/qstackedwidget.html .

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QStackedWidget, \
    QWidget, QHBoxLayout, QFormLayout, QLineEdit, QRadioButton, QLabel
from PyQt5.QtGui import QIcon


class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)        
        self.initUI()
        hbox = QHBoxLayout(self.centralWidget)
        hbox.addWidget(self.stack)

    def initUI(self):
        selection1 = QAction(QIcon("im.png"), 'selection1', self)
        selection1.triggered.connect(self.selection_1_widgets)      
        selection2 = QAction(QIcon("Ok.png"), 'selection2', self)
        selection2.triggered.connect(self.selection_2_widgets)         

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('menu')
        fileMenu.addAction(selection1)
        fileMenu.addAction(selection2)

        self.stack1 = QWidget()
        self.stack1Ui()
        self.stack2 = QWidget()
        self.stack2Ui()
        self.stack = QStackedWidget(self)
        self.stack.addWidget(self.stack1)
        self.stack.addWidget(self.stack2)

    def selection_1_widgets(self):
        self.stack.setCurrentIndex(0)
        
    def selection_2_widgets(self):
        self.stack.setCurrentIndex(1)
        
    def stack1Ui(self):
        layout = QFormLayout()
        layout.addRow("Name",    QLineEdit())
        layout.addRow("Address", QLineEdit())
        self.stack1.setLayout(layout)
        
    def stack2Ui(self):
        layout = QFormLayout()
        sex = QHBoxLayout()
        sex.addWidget(QRadioButton("Male"))
        sex.addWidget(QRadioButton("Female"))
        layout.addRow(QLabel("Sex"),sex)
        layout.addRow("Date of Birth",QLineEdit())
        self.stack2.setLayout(layout)
 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Main()
    ex.resize(300, 200)
    ex.show()
    sys.exit(app.exec_())