使用Python,PyQt,Qt Designer用新窗口替换现有的MainWindow

时间:2016-10-02 17:32:24

标签: python pyqt qt-designer

我是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 个答案:

答案 0 :(得分: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创建一个主窗口并将不同的控件和窗口小部件放在堆叠窗口小部件的不同选项卡上,并在同一窗口中切换它们,那会好得多。

答案 1 :(得分: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()

答案 2 :(得分:1)

这是一个简单的例子,你只需要使用自己的后勤,但它是一种表示你要找的东西的简单方法。

如果你喜欢或不同的布局来处理你的"对象,你可以使用QWindow而不是QWidgets。管他呢。也许改变一下如何在布局中添加项目,如果不是小部件...这样的事情。 :)

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,你必须改变所有的输入。