python - PyQt5点击button如何弹出新窗口?

 手机用户2502873425 发布于 2022-10-28 19:05

怎么通过点击button,来打开一个新的窗口?
是写在同一个脚本里,还是把新窗口的代码放在另一个脚本里,然后通过点击按钮来运行?

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class FirstWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.windowUI()

    def windowUI(self):
        self.setWindowTitle("Login")
        self.textfield()
        self.center()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def textfield(self):
        QToolTip.setFont(QFont('SansSerif', 12))
        user = QLabel("User:")
        userEdit = QLineEdit()
        userEdit.setToolTip("请输入你的帐号")

        passWord = QLabel("PassWord:")
        passWordEdit = QLineEdit()
        passWordEdit.setToolTip("请输入你的密码")

        grid = QGridLayout()
        grid.setSpacing(0)

        grid.addWidget(user, 0, 0)
        grid.addWidget(userEdit, 1, 0)
        grid.addWidget(passWord, 2, 0)
        grid.addWidget(passWordEdit, 3, 0)
        empty = QLabel()
        grid.addWidget(empty, 4, 0)

        btn_logon = QPushButton("Log on")
        btn_quit = QPushButton("Quit")
        grid.addWidget(btn_logon, 5, 0, 1, 2)
        grid.addWidget(btn_quit, 6, 0, 1, 2)

        btn_logon.clicked.connect(self.onclick)
        btn_quit.clicked.connect(quit)

        self.setLayout(grid)

    def onclick(self):
        newWindow = SecondWindow()
        newWindow.show()
        newWindow.exec_()

class SecondWindow(QWidget):
    def __init__(self):
        super().__init__
        self.newWindowUI

    def newWindowUI(self):
        self.resize(300,300)
        self.move(200,200)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    ex = FirstWindow()
    ex.show()
    sys.exit(App.exec_())
2 个回答
  • -- coding: utf-8 --

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *

    class FirstWindow(QWidget):

    close_signal = pyqtSignal()
    def __init__(self, parent=None):
        # super这个用法是调用父类的构造函数,parent=None表示默认没有父Widget,如果有则调用之
        super(FirstWindow, self).__init__(parent)
        self.resize(800, 600)
        self.setMaximumSize(QSize(800, 600))
        self.btn = QToolButton(self)
        self.btn.setText("click")
        self.two = SecondWindow()
        self.btn.clicked.connect(self.two.handle_click)
        #self.btn.clicked.connect(self.hide)
        self.close_signal.connect(self.closeSlot)
        print("FirstWindow")
    
    def closeEvent(self, event):
        print("close signal emit by FirstWindow")
        self.close_signal.emit()
        #self.close()
    
    def closeSlot(self):
        print("close signal slot to SecondWindow")
        self.two.close()
    

    class SecondWindow(QWidget):

    close_signal = pyqtSignal()
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.resize(800, 600)
        self.setMaximumSize(QSize(800, 600))
        self.setStyleSheet("background: black")
        self.close_signal.connect(self.closeSlot)
        
    def handle_click(self):
        if not self.isVisible():
            self.show()
            print("SecondWindow")
    
    def closeEvent(self, event):
        print("close signal emit by SecondWindow")
        self.close_signal.emit()
        #self.close()
    
    def closeSlot(self):
        print("close signal slot to FirstWindow")
        one.close()
    

    if name == "__main__":

    App = QApplication(sys.argv)
    one = FirstWindow()
    one.show()
    sys.exit(App.exec_())
    
    2022-11-12 01:45 回答
  • 代码量不大的话,放一个文件就行了,要是代码比较多的话,考虑到维护的方便,还是放在2个里面比较好,这种事件的触发和界面切换一般都是用signal-slot做的,使得语义看起来非常清晰

    # -*- coding: utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    
    
    class FirstWindow(QWidget):
    
        close_signal = pyqtSignal()
        def __init__(self, parent=None):
            # super这个用法是调用父类的构造函数
            # parent=None表示默认没有父Widget,如果指定父亲Widget,则调用之
            super(FirstWindow, self).__init__(parent)
            self.resize(100, 100)
            self.btn = QToolButton(self)
            self.btn.setText("click")
    
        def closeEvent(self, event):
            self.close_signal.emit()
            self.close()
    
    
    class SecondWindow(QWidget):
        def __init__(self, parent=None):
            super(SecondWindow, self).__init__(parent)
            self.resize(200, 200)
            self.setStyleSheet("background: black")
    
        def handle_click(self):
            if not self.isVisible():
                self.show()
    
        def handle_close(self):
            self.close()
    
    
    if __name__ == "__main__":
        App = QApplication(sys.argv)
        ex = FirstWindow()
        s = SecondWindow()
        ex.btn.clicked.connect(s.handle_click)
        ex.btn.clicked.connect(ex.hide)
        ex.close_signal.connect(ex.close)
        ex.show()
        sys.exit(App.exec_())
    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有