在主窗口添加按钮,并把按钮信号关联槽, 在槽函数中创建子窗口对象赋值到普通变量 ,并调用其 show 方法。

from PyQt5.QtWidgets import *
import sys
class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        button = QPushButton("弹出子窗", self)
        button.clicked.connect(self.show_child)
    def show_child(self):
        child_window = Child()
        child_window.show()
class Child(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我是子窗口啊")
# 运行主窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口一闪而过。

在主窗口添加按钮,并把按钮信号关联槽, 在槽函数中创建子窗口对象并赋值为对象属性 ,并调用其 show 方法。

from PyQt5.QtWidgets import *
import sys
class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        button = QPushButton("弹出子窗", self)
        button.clicked.connect(self.show_child)
    def show_child(self):
        self.child_window = Child()
        self.child_window.show()
class Child(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我是子窗口啊")
# 运行主窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口正常打开,重复点击按钮,子窗口重复弹出。

主窗口__init__方法中创建子窗口对象并 赋值为对象属性, 添加按钮,并把按钮信号关联槽,在槽函数中调用子窗口对象的 show 方法。

from PyQt5.QtWidgets import *
import sys
class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        button = QPushButton("弹出子窗", self)
        button.clicked.connect(self.show_child)
        self.child_window = Child()
    def show_child(self):
        self.child_window.show()
class Child(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我是子窗口啊")
# 运行主窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

运行结果: 重复点击按钮,子窗口不重复弹出。

把例1的show()方法改为exec()方法

from PyQt5.QtWidgets import *
import sys
class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        button = QPushButton("弹出子窗", self)
        button.clicked.connect(self.show_child)
    def show_child(self):
        child_window = Child()
        child_window.exec()
class Child(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我是子窗口啊")
# 运行主窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

运行结果:子窗口顺利弹出,且不能重新选择父窗口

例2比例1仅仅多了一个self怎么就运行正常了呢?

例4与例1仅改了一个一个方法怎么又能正常显示了呢?

这里涉及到一个概念 模式对话框 与 非模式对话框 (modeless dialog | modal dialog)

模式对话框,就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是”或“否”)。
非模式对话框,在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。

show() ------  modeless dialog

exec() ------- modal dialog

  • 例1中 子窗口 通过 show() 方法显示,为非模态窗口,它的实例为父窗口show_child()方法中的局部变量,当窗口显示后,父窗口的show_child()方法继续执行,当方法运行完后,python的回收机制就把局部变量销毁了,相当于子窗口实例被销毁,故子窗口一闪而过;
  • 例2中 子窗口实例为 主窗口类的变量,当show_child()方法运行完后,主窗口对象依旧存在,子窗口实例也存在,故子窗口正常显示,但是每一次运行槽函数都会重新创建子窗口对象;
  • 例3中 子窗口实例为 主窗口类的变量,当show_child()方法运行完后,主窗口对象依旧存在,子窗口实例也存在,故子窗口正常显示,每一次show_child()函数,重新调用子窗口对象show_child()方法,不会创建新窗口,且可随意在父,子窗口间切换;
  • 例3中 子窗口 通过 exec() 方法显示,为模态窗口,虽然他为父窗口show_child()方法中的局部变量,由于阻塞的机制,父窗口show_child()并没有继续执行,故其不会像 例1 中 一闪而过,且不能在父,子窗口间切换;

欢迎批评指教。

参考资料: https://www.cnblogs.com/dcb3688/p/4586373.html

修改于2020-03-05

需求:在PYQT5中,点击主窗口中的按钮,弹出子窗口。测试代码:例1:在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到普通变量,并调用其show 方法。from PyQt5.QtWidgets import *import sysclass Main(QMainWindow): def __init__(self): su... 使用Qtdesigner设计ui界面,实行界面分离,分别设计两个界面,一个是登录的界面,一个是 界面 然后 建一个 Python 文件,在文件中分别将这两个界面UI引入,分别创建两个类,一个是实现登录 显示 的类,另一个是实现 界面 显示 的类。   创建两个类, 窗口 类  登录 窗口 类  最后使用一个main函数,在这个函数中实例化登录 窗口 类, 显示 登录 窗口 然后在登录 窗口 中实例化 窗口 类,使用 窗口 类.show()方法进行 显示 窗口 ,并且关闭原来的登录 窗口 二、将两个类分别写在两个 Python 文件夹中 创建两个不同的或者相同的 窗口 类,然后在登录 窗口
QInputDialog-- 出输入对话框1. 输入整数2. 输入小数3. 输入文本4. 输入多行文本5. 输入选项 QMessageBox-- 出消息提示框1. 信息2. 问答3. 警告4. 危险5. 关于6.三、QFileDialog-- 出文件对话框 PyQt5 窗口 最常用的三种:输入框、消息提示、文件夹对话框,下面详细介绍这三大类。 一、QInputDialog– 出输入对话框 1. 输入整数 # 后面四个数字的作用依次是 初始值 最小值 最大值 步幅 value
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwid
要在 PyQt5 窗口 中打开子 窗口 ,您可以使用QMainWindow类作为 窗口 ,并将QDialog类用作子 窗口 。 首先,您需要创建一个 的QDialog子 窗口 类,该类将继承自QDialog类。在该类中,您可以添加您希望在子 窗口 显示 的各种小部件和布局。例如: class MyDialog(QDialog): def __init__(self): super().__init__() self.setWindowTitle("子 窗口 标题") self.setFixedSize(300, 200) layout = QVBoxLayout() label = QLabel("这是一个子 窗口 ") layout.addWidget(label) self.setLayout(layout) 接下来,在 窗口 类中,您可以创建一个QAction并将其连接到一个槽函数,该函数将创建并 显示 窗口 。例如: class MyMainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(" 窗口 标题") self.setFixedSize(400, 300) menubar = self.menuBar() file_menu = menubar.addMenu("文件") new_action = QAction("打开子 窗口 ", self) new_action.triggered.connect(self.open_dialog) file_menu.addAction(new_action) def open_dialog(self): dialog = MyDialog() dialog.exec_() 在这里,我们将QAction对象连接到了open_dialog()槽函数。该函数创建一个MyDialog对象并调用exec_()函数来 显示 窗口 。当您在 窗口 中单击“打开子 窗口 ”菜单项时,将调用此函数并 显示 窗口