繁体   English   中英

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

[英]Replacing the existing MainWindow with a new window with Python, PyQt, Qt Designer

我是Python GUI编程的新手,制作GUI应用程序时遇到麻烦。 我有一个仅带有按钮小部件的主窗口。 我想知道的是,发生事件(例如单击按钮)时如何用新窗口替换现有窗口。
一个类似问题的答案在这里替换MainWindow中的CentralWidget ,建议使用QStackedWidgets,但他们没有使用Qt Designer来制作其GUI应用程序,而我有两个.py文件,一个是主窗口文件,另一个是我想要的窗口在按下按钮后显示,因此我不知道如何在main.py文件中将两者结合起来。 例如,我的主窗口如下所示:
主视窗
在单击按钮后,应使用以下命令替换现有窗口:
新窗户
我还想知道第二个窗口是否应为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()

您可能不想实际创建和删除一堆窗口,但是如果您确实愿意,可以这样做

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主窗口,然后将不同的控件和窗口小部件放在堆叠窗口小部件的不同选项卡上,然后在同一窗口中进行切换,那会更好。

您可以使用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()

这是一个简单的示例,您只需要使用自己的物流即可,但这是表示所需内容的简单方法。

如果愿意,可以使用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,则必须更改所有导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM