如何在 PySide 中更改 window 中的内容?

How to change a content in a window in PySide?

我想单击菜单栏 "Tools" 菜单以完全更改我的 window 内容。我如何使用 PySide 执行此操作?我是否应该调用 QAction 并将新的小部件设置为具有旧 window 父级的中央小部件?我也是 python 和英语的初学者。到目前为止,我只创建了一个 window 应用程序。

首先,我会在 QWidget 的子类中定义每个工具。其次,我会将这样创建的每个工具小部件的实例添加到主要 window 的中央小部件的布局中。最后,我将向 menuBar 添加操作并将它们连接到方法以根据需要显示和隐藏工具。

下面的示例展示了如何使用 2 种不同的工具完成此操作:

from PySide import QtGui 
import sys

class myApplication(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(myApplication, self).__init__(parent)

        self.setWindowTitle('No Tool is Selected')

        #---- create instance of each tool widget ----

        self.tool1 = Tool1(self)
        self.tool2 = Tool2(self)

        #---- layout for central widget ----

        centralWidget = QtGui.QWidget()
        centralLayout = QtGui.QGridLayout()
        centralLayout.addWidget(self.tool1, 0, 0)
        centralLayout.addWidget(self.tool2, 1, 0)
        centralWidget.setLayout(centralLayout)

        self.setCentralWidget(centralWidget)  

        #---- set the menu bar ----

        contentMenu = self.menuBar().addMenu(("Tools"))
        contentMenu.addAction('show Tool 1', self.show_Tool1)
        contentMenu.addAction('show Tool 2', self.show_Tool2)
        contentMenu.addAction('show All', self.show_All)

    def show_Tool1(self):
        self.tool1.show()
        self.tool2.hide()
        self.setWindowTitle('Tool #1 is Selected')

    def show_Tool2(self):
        self.tool1.hide()
        self.tool2.show()
        self.setWindowTitle('Tool #2 is Selected')

    def show_All(self):
        self.tool1.show()
        self.tool2.show()
        self.setWindowTitle('All Tools are Selected')

class Tool1(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Tool1, self).__init__(parent)

        layout = QtGui.QGridLayout()
        layout.addWidget(QtGui.QPushButton('Tool #1'))
        self.setLayout(layout)
        self.hide()

class Tool2(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Tool2, self).__init__(parent)

        layout = QtGui.QGridLayout()
        layout.addWidget(QtGui.QTextEdit('Tool #2'))
        self.setLayout(layout)
        self.hide()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    instance = myApplication()  
    instance.show()    
    sys.exit(app.exec_())

这导致: