信号与槽
1.基本概念
信号与槽是Qt的核心机制,在PyQt5中,信号与槽是通过对象的signal.connect()方法进行连接的。
PyQt5中使用信号与槽的主要特点如下:
1.一个信号可以连接多个槽
2.一个槽可以监听多个信号
3.信号与信号之间可以互连
4.信号与槽的连接可以跨线程
5.信号与槽的连接方式既可以是同步,也可以是异步
6.信号的参数可以是任何的Python类型
以下是信号与槽的连接工作示意过程
2.编辑信号与槽
1.打开Qtdesigner,添加PushButton按钮,设置text属性值为“关闭”
2.选中添加的“关闭”按钮,在菜单栏中选择“编辑信号/槽”菜单项,然后按住鼠标左键拖动至窗口的空白区域,自动弹出“配置连接”对话框,首先选择“显示从QWidget继承的信号与槽”复选框,然后在上方的信号与槽列表中分别选中“clicked()”和“close()”
3.单击OK,即可完成信号与槽的关联
关闭窗口的关键代码如下
self.pushButton.clicked.connect(MainWindow.close)
3.自定义槽
自定义一个槽函数,用单击按钮时,弹出一个“hello world”信息提示框
def Showmessage(self):
from PyQt5.QtWidgets import QMessageBox
QMessageBox.information(MainWindow,'提示','hello world',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
将自定义槽连接到信号
self.pushButton.clicked.connect(self.Showmessage) #点击事件
多窗口设计
窗口1:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Window1(object):
def setupUi(self, Window1):
Window1.setObjectName("Window1")
Window1.setEnabled(True)
Window1.resize(426, 265)
self.centralwidget = QtWidgets.QWidget(Window1)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(100, 80, 93, 28))
self.pushButton.setObjectName("pushButton")
Window1.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(Window1)
self.menubar.setGeometry(QtCore.QRect(0, 0, 426, 26))
self.menubar.setObjectName("menubar")
Window1.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(Window1)
self.statusbar.setObjectName("statusbar")
Window1.setStatusBar(self.statusbar)
self.retranslateUi(Window1)
QtCore.QMetaObject.connectSlotsByName(Window1)
self.pushButton.clicked.connect(self.open)
def open(self):
import untitled2, untitled3, untitled4
self.second = untitled2.Ui_Window2()
self.second.show() # 显示窗体
self.third = untitled3.Ui_Window4()
self.third.show() # 显示窗体
self.fouth = untitled4.Ui_Window3()
self.fouth.show() # 显示窗体
def retranslateUi(self, Window1):
_translate = QtCore.QCoreApplication.translate
Window1.setWindowTitle(_translate("Window1", "MainWindow"))
self.pushButton.setText(_translate("Window1", "打开"))
def __init__(self): #构造方法
super(Ui_Window1,self).__init__()
self.setupUi(self) #初始化窗口设置
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Window1 = QtWidgets.QMainWindow()
ui = Ui_Window1()
ui.setupUi(Window1)
Window1.show()
sys.exit(app.exec_())
窗口2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_Window2(QMainWindow):
def setupUi(self, Window2):
Window2.setObjectName("Window2")
Window2.resize(240, 320)
self.centralwidget = QtWidgets.QWidget(Window2)
self.centralwidget.setObjectName("centralwidget")
Window2.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(Window2)
self.menubar.setGeometry(QtCore.QRect(0, 0, 240, 26))
self.menubar.setObjectName("menubar")
Window2.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(Window2)
self.statusbar.setObjectName("statusbar")
Window2.setStatusBar(self.statusbar)
self.retranslateUi(Window2)
QtCore.QMetaObject.connectSlotsByName(Window2)
def retranslateUi(self, Window2):
_translate = QtCore.QCoreApplication.translate
Window2.setWindowTitle(_translate("Window2", "MainWindow"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Window2 = QtWidgets.QMainWindow()
ui = Ui_Window2()
ui.setupUi(Window2)
Window2.show()
sys.exit(app.exec_())
窗口3
from PyQt5.QtWidgets import QMainWindow
class Ui_Window4(QMainWindow):
def setupUi(self, Window4):
Window4.setObjectName("Window4")
Window4.resize(224, 320)
self.centralwidget = QtWidgets.QWidget(Window4)
self.centralwidget.setObjectName("centralwidget")
Window4.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(Window4)
self.menubar.setGeometry(QtCore.QRect(0, 0, 224, 26))
self.menubar.setObjectName("menubar")
Window4.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(Window4)
self.statusbar.setObjectName("statusbar")
Window4.setStatusBar(self.statusbar)
self.retranslateUi(Window4)
QtCore.QMetaObject.connectSlotsByName(Window4)
def retranslateUi(self, Window4):
_translate = QtCore.QCoreApplication.translate
Window4.setWindowTitle(_translate("Window4", "MainWindow"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Window4 = QtWidgets.QMainWindow()
ui = Ui_Window4()
ui.setupUi(Window4)
Window4.show()
sys.exit(app.exec_())
窗口4
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_Window3(QMainWindow):
def setupUi(self, Window3):
Window3.setObjectName("Window3")
Window3.resize(320, 240)
self.centralwidget = QtWidgets.QWidget(Window3)
self.centralwidget.setObjectName("centralwidget")
Window3.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(Window3)
self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 26))
self.menubar.setObjectName("menubar")
Window3.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(Window3)
self.statusbar.setObjectName("statusbar")
Window3.setStatusBar(self.statusbar)
self.retranslateUi(Window3)
QtCore.QMetaObject.connectSlotsByName(Window3)
def retranslateUi(self, Window3):
_translate = QtCore.QCoreApplication.translate
Window3.setWindowTitle(_translate("Window3", "MainWindow"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Window3 = QtWidgets.QMainWindow()
ui = Ui_Window3()
ui.setupUi(Window3)
Window3.show()
sys.exit(app.exec_())