在主窗口添加按钮,并把按钮信号关联槽,
在槽函数中创建子窗口对象赋值到普通变量
,并调用其 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_()函数来
显示
子
窗口
。当您在
主
窗口
中单击“打开子
窗口
”菜单项时,将调用此函数并
显示
子
窗口
。