Python----PyQt开发(PyQt高级:界面切换,信号与槽功能pyqtSignal)
一、效果展示
二、设计PyQt界面
主页面
self.setWindowTitle("主界面")
self.login_btn = QPushButton("登录", self)
self.login_btn.setGeometry(200, 50, 100, 40)
self.reg_btn = QPushButton("注册", self)
self.reg_btn.setGeometry(200, 120, 100, 40)
self.exit_btn = QPushButton("退出", self)
self.exit_btn.setGeometry(200, 190, 100, 40)
登录页面
class loginWidge(QWidget):
send_index = pyqtSignal() # 定义信号,用于返回主界面
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.setWindowTitle('登录界面') # 设置窗口标题
self.setGeometry(700, 400, 600, 500) # 设置窗口位置和大小
# 创建返回按钮
self.exit_index_btn = QPushButton('返回', self)
self.exit_index_btn.setGeometry(200, 50, 200, 80)
注册页面
class RegQwidget(QWidget):
send_index = pyqtSignal() # 定义信号,用于返回主界面
send_login = pyqtSignal(str, int) # 定义信号,用于发送登录信息
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.setWindowTitle('注册界面') # 设置窗口标题
self.setGeometry(700, 400, 600, 500) # 设置窗口位置和大小
# 创建返回按钮
self.exit_index_btn = QPushButton('返回', self)
self.exit_index_btn.setGeometry(200, 50, 200, 80)
三、槽连接组件交互
3.1、从主页面到副页面
def slot_init(self):
# 连接按钮点击事件到相应的槽函数
self.login_btn.clicked.connect(self.login_wid)
self.reg_btn.clicked.connect(self.reg_wid)
self.exit_btn.clicked.connect(self.exit_wid)
def login_wid(self):
self.close() # 关闭主窗口
self.login_show.show() # 显示登录窗口
def reg_wid(self):
self.close() # 关闭主窗口
self.reg_show.show() # 显示注册窗口
def exit_wid(self):
# 弹出确认退出的消息框
self.result = QMessageBox.question(self, '提示', '确定要退出吗', QMessageBox.Yes | QMessageBox.No)
if self.result == QMessageBox.Yes:
sys.exit(0) # 确认退出,结束程序
else:
pass # 选择不退出,什么都不做
3.2、从副页面返回主页面
def login_wid(self):
self.close() # 关闭主窗口
self.login_show.show() # 显示登录窗口
def indexwid_show(self):
self.close() # 关闭登录窗口
self.send_index.emit() # 发射返回主界面的信号
注册窗口的
send_login
信号连接到登录窗口的send_recv
槽函数,实现了注册信息从注册窗口到登录窗口的传递。登录窗口和注册窗口的
send_index
信号连接到主窗口的show
槽函数,实现了点击返回按钮后主窗口的显示。
四、用到的库函数
Qt Widgets 和布局:
QWidget: 创建基本的窗口部件。
QPushButton: 创建按钮。
QMessageBox: 创建消息框,用于显示提示信息。
QProgressBar: 创建进度条(虽然在这段代码中没有使用,但导入了该类)。
Qt Core:
QApplication: 应用程序类,管理应用的控制流和主要设置。
QTimer: 定时器类(虽然在这段代码中没有使用,但导入了该类)。
pyqtSignal: 定义信号,用于在类之间传递信息。
信号和槽:
clicked.connect(): 连接按钮点击事件到槽函数。
send_index.connect(): 连接自定义信号到槽函数。
send_login.connect(): 连接自定义信号到槽函数。
窗口设置:
setWindowTitle(): 设置窗口的标题。
setGeometry(): 设置窗口的位置和大小。
控制窗口显示:
show(): 显示窗口。
close(): 关闭窗口。
五、完整代码
import random # 导入随机数模块
from PyQt5.QtCore import QTimer, pyqtSignal # 导入定时器和信号
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QProgressBar # 导入Qt小部件
import sys # 导入系统模块以处理命令行参数
# 创建主窗口类
class MyQwidget(QWidget):
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.ui_init() # 初始化用户界面
self.slot_init() # 初始化信号与槽
def ui_init(self):
self.setWindowTitle('主界面') # 设置窗口标题
self.setGeometry(700, 400, 600, 500) # 设置窗口位置和大小
# 创建登录按钮
self.login_btn = QPushButton('登录', self)
self.login_btn.setGeometry(200, 50, 200, 80)
# 创建注册按钮
self.reg_btn = QPushButton('注册', self)
self.reg_btn.setGeometry(200, 200, 200, 80)
# 创建退出按钮
self.exit_btn = QPushButton('退出', self)
self.exit_btn.setGeometry(200, 350, 200, 80)
# 创建登录和注册窗口实例
self.login_show = loginWidge()
self.reg_show = RegQwidget()
# 连接注册窗口的信号到登录窗口的接收函数
self.reg_show.send_login.connect(self.login_show.send_recv)
def slot_init(self):
# 连接按钮点击事件到相应的槽函数
self.login_btn.clicked.connect(self.login_wid)
self.reg_btn.clicked.connect(self.reg_wid)
self.exit_btn.clicked.connect(self.exit_wid)
# 连接登录和注册窗口的返回信号到主窗口的显示函数
self.login_show.send_index.connect(self.show)
self.reg_show.send_index.connect(self.show)
def login_wid(self):
self.close() # 关闭主窗口
self.login_show.show() # 显示登录窗口
def reg_wid(self):
self.close() # 关闭主窗口
self.reg_show.show() # 显示注册窗口
def exit_wid(self):
# 弹出确认退出的消息框
self.result = QMessageBox.question(self, '提示', '确定要退出吗', QMessageBox.Yes | QMessageBox.No)
if self.result == QMessageBox.Yes:
sys.exit(0) # 确认退出,结束程序
else:
pass # 选择不退出,什么都不做
# 创建登录窗口类
class loginWidge(QWidget):
send_index = pyqtSignal() # 定义信号,用于返回主界面
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.setWindowTitle('登录界面') # 设置窗口标题
self.setGeometry(700, 400, 600, 500) # 设置窗口位置和大小
# 创建返回按钮
self.exit_index_btn = QPushButton('返回', self)
self.exit_index_btn.setGeometry(200, 50, 200, 80)
self.exit_index_btn.clicked.connect(self.indexwid_show) # 连接按钮点击事件
def indexwid_show(self):
self.close() # 关闭登录窗口
self.send_index.emit() # 发射返回主界面的信号
def send_recv(self, arg, arg1):
print(arg, arg1) # 打印接收到的信号参数
# 创建注册窗口类
class RegQwidget(QWidget):
send_index = pyqtSignal() # 定义信号,用于返回主界面
send_login = pyqtSignal(str, int) # 定义信号,用于发送登录信息
def __init__(self):
super().__init__() # 调用父类的初始化方法
self.setWindowTitle('注册界面') # 设置窗口标题
self.setGeometry(700, 400, 600, 500) # 设置窗口位置和大小
# 创建返回按钮
self.exit_index_btn = QPushButton('返回', self)
self.exit_index_btn.setGeometry(200, 50, 200, 80)
self.exit_index_btn.clicked.connect(self.indexwid_show) # 连接按钮点击事件
def indexwid_show(self):
self.close() # 关闭注册窗口
self.send_index.emit() # 发射返回主界面的信号
self.send_login.emit('注册', 123) # 发射登录信息信号,发送示例数据
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建QApplication对象,传入命令行参数
w = MyQwidget() # 创建主窗口对象
w.show() # 显示主窗口
sys.exit(app.exec_()) # 进入应用的主循环
其主要是实现信号与槽功能
在本代码实现过程中:
注册窗口的
send_login
信号连接到登录窗口的send_recv
槽函数,实现了注册信息从注册窗口到登录窗口的传递。登录窗口和注册窗口的
send_index
信号连接到主窗口的show
槽函数,实现了点击返回按钮后主窗口的显示。
信号与槽函数参数设计规则:
《1》信号的参数个数要>=槽函数参数的个数信号参数有3个槽函数参数可以有1个、2个、3个这三种情况
《2》槽函数参数的类型与信号参数类型的匹配顺序必须是从左向右的信号的参数类型strint槽函数如果有一个参数,只能是str类型槽函数如果有两个参数,只能是str、int类型