使用Python、PyQt和Qt Designer替换现有的MainWindow为新窗口

6
我是新手Python GUI编程,我在制作GUI应用程序时遇到了麻烦。我有一个只有一个按钮部件的主窗口。我想知道的是,如何在事件发生时(例如按钮单击)用新窗口替换现有窗口。
一个类似问题的答案在这里 Replace CentralWidget in MainWindow,建议使用QStackedWidgets,但他们没有使用Qt Designer制作GUI应用程序,而我有两个.py文件,一个是主窗口文件,另一个是我想要在按钮按下后显示的窗口文件,因此我不知道如何将这两个文件合并到我的main.py文件中。 例如,我的主窗口如下所示:
Main Window
点击按钮后,它应该用以下内容替换现有窗口:
New Window
我还想知道第二个窗口应该是QStackedWindow、QDialog还是QWidget类型?
以下是我的main.py代码
from PyQt4 import QtGui
import sys
import design, design1
import os

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow):
    def __init__(self, parent=None):
        super(ExampleApp, self).__init__(parent)
        self.setupUi(self)
        self.btnBrowse.clicked.connect(self.doSomething)


    def doSomething(self):
        # Code to replace the main window with a new window
        pass


def main():
    app = QtGui.QApplication(sys.argv)
    form = ExampleApp()
    form.show()
    app.exec_()


if __name__ == '__main__':
    main()
3个回答

2
您可能不想实际创建和删除大量的窗口,但如果您真的想这么做,可以像这样操作。
def doSomething(self):
    # Code to replace the main window with a new window
    window = OtherWindow()
    window.show()
    self.close()
OtherWindow 类中的

内容

class OtherWindow(...):
    ...
    def doSomething(self):
        window = ExampleApp()
        window.show()
        self.close()

实际上,您可能不想这样做。最好的方法是创建一个主窗口,使用QStackedWidget将不同的控件和小部件放在堆叠窗口的不同选项卡中,并在同一个窗口中切换它们。


2
你可以使用 QStackedWindow 创建一个全新的窗口,然后通过 onclick() 事件将其连接到主窗口。
button.clicked.connect(self.OtherWindow)

否则,您可以直接使用
class OtherWindow(self):
    Owindow = OtherWindow()  
    Owindow.show()

def main():
    app = QtGui.QApplication(sys.argv)
    form = ExampleApp()
    form.show()
    app.exec_()


if __name__ == '__main__':
    main()

为什么你不关闭另一个窗口? - Liron Lavi

2
这里有一个简单的例子,你只需要使用自己的逻辑,但这是一种简单的方式来表示你要寻找的内容。
如果你喜欢,可以使用QWindow而不是QWidgets,或者不同的布局来排列你的“对象”或其他东西。也许可以稍微改变一下如何在布局中添加项目,如果不是widget的话...诸如此类的事情。 :)
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QStackedLayout
from PyQt5.QtWidgets import QWidget, QApplication

class MyWindow(QMainWindow):

    front_wid = None

    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        # MAIN WINDOW size
        self.setFixedSize(200,200)

        # CENTRAL WIDGET
        self.central_wid = QWidget()
        self.layout_for_wids = QStackedLayout()

        # BUTTON TO SWITCH BETWEEN WIDGETS
        self.btn_switch = QPushButton("Switch")
        self.btn_switch.clicked.connect(self.switch_wids)
        self.btn_switch.setFixedSize(50,50)
        self.btn_switch

        # 2 WIDGETS
        self.wid1 = QWidget()
        self.wid1.setStyleSheet("""background: blue;""")
        self.wid1.setFixedSize(200,200)
        self.wid1.move(100, 100)
        self.wid2 = QWidget()
        self.wid2.setStyleSheet("""background: green;""")
        self.wid2.setFixedSize(200, 200)
        self.wid2.move(100, 100)

        # LAYOUT CONTAINER FOR WIDGETS AND BUTTON
        self.layout_for_wids.addWidget(self.btn_switch)
        self.layout_for_wids.addWidget(self.wid1)
        self.layout_for_wids.addWidget(self.wid2)

        # ENTERING LAYOUT
        self.central_wid.setLayout(self.layout_for_wids)

        # CHOOSE YOUR CENTRAL WIDGET
        self.setCentralWidget(self.central_wid)

        # WHICH WIDGET IS ON THE FRONT
        self.front_wid = 1

    def switch_wids(self):

        # LOGIC TO SWITCH
        if self.front_wid == 1:
            self.wid1.hide()
            self.wid2.show()
            self.front_wid = 2
        else:
            self.wid1.show()
            self.wid2.hide()
            self.front_wid = 1



if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.resize(222, 222)
    main.show()

    sys.exit(app.exec_())

顺便提一下,这是PyQt5,如果你想使用PyQt4,你只需要改变导入的方式就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接