自定义信号槽
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
sendmsg = pyqtSignal(object)
def run(self):
self.sendmsg.emit("hello pyqt5")
class MySlot(QObject):
def get(self, msg):
print("信息:" + msg)
if __name__ == "__main__":
send = MyTypeSignal()
slot = MySlot()
send.sendmsg.connect(slot.get)
send.run()
send.sendmsg.disconnect(slot.get)
send.run()
多参数信号
from PyQt5.QtCore import *
class MyTypeSignal(QObject):
sendmsg = pyqtSignal(object)
sendmsg1 = pyqtSignal(str, int, int)
def run(self):
self.sendmsg.emit("hello pyqt5")
def run1(self):
self.sendmsg1.emit("hello", 3, 4)
class MySlot(QObject):
def get(self, msg):
print("信息:" + msg)
def get1(self, msg, a, b):
print(msg)
print(a + b)
if __name__ == "__main__":
send = MyTypeSignal()
slot = MySlot()
send.sendmsg.connect(slot.get)
send.sendmsg1.connect(slot.get1)
send.run()
send.run1()
类添加多个信号
from PyQt5.QtCore import *
class MultSingal(QObject):
singal1 = pyqtSignal()
singal2 = pyqtSignal(int)
singal3 = pyqtSignal(int, str)
singal4 = pyqtSignal(list)
singal5 = pyqtSignal(dict)
singal6 = pyqtSignal([int, str], [str])
def __init__(self):
super(MultSingal, self).__init__()
self.singal1.connect(self.singalcall1)
self.singal2.connect(self.singalcall2)
self.singal3.connect(self.singalcall3)
self.singal4.connect(self.singalcall4)
self.singal5.connect(self.singalcall5)
self.singal6[str].connect(self.singalcall6overload)
self.singal6[int, str].connect(self.singalcall6)
self.singal1.emit()
self.singal2.emit(10)
self.singal3.emit(1, "hello")
self.singal4.emit([1, 2, 3, 4, 5, 6])
self.singal5.emit({"name:": "bill", "age": 30})
self.singal6[str].emit("test")
self.singal6[int, str].emit(100, "mytest")
def singalcall1(self):
print("singal1 emit")
def singalcall2(self, val):
print("singal2 emit,value:", val)
def singalcall3(self, val, text):
print("singal3 emit,value", val, text)
def singalcall4(self, val):
print("singal4 emit", val)
def singalcall5(self, val):
print("singal5 emit,value:", val)
def singalcall6(self, val, text):
print("singal6 emit,value", val, text)
def singalcall6overload(self, val):
print("singal6 emit,value", val)
if __name__ == "__main__":
multsignal = MultSingal()
N对N连接
from PyQt5.QtCore import *
class NNSingal(QObject):
singal1 = pyqtSignal()
singal2 = pyqtSignal(int)
singal3 = pyqtSignal()
def __init__(self):
super(NNSingal, self).__init__()
self.singal1.connect(self.call1)
self.singal1.connect(self.call11)
self.singal1.emit()
self.singal2.connect(self.singal1)
self.singal2.emit(10)
self.singal1.disconnect(self.call1)
self.singal1.disconnect(self.call11)
self.singal2.disconnect(self.singal1)
self.singal1.connect(self.call1)
self.singal2.connect(self.call2)
self.singal3.connect(self.call1)
self.singal1.emit()
self.singal2.emit(10)
self.singal3.emit()
def call1(self):
print("call emit")
def call11(self):
print("call11 emit")
def call2(self, val):
print("call2 emit:", val)
if __name__ == "__main__":
nnsingal = NNSingal()
窗口添加信号
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
class winsingal(QWidget):
button_clicked_singal = pyqtSignal()
def __init__(self):
super().__init__()
self.setWindowTitle("为窗口类添加信号")
self.resize(300, 100)
btn = QPushButton("关闭窗口", self)
btn.clicked.connect(self.btn_clicked)
self.button_clicked_singal.connect(self.btn_close)
def btn_clicked(self):
self.button_clicked_singal.emit()
def btn_close(self):
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
example = winsingal()
example.show()
sys.exit(app.exec())
主线程更新UI数据
from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit
import time
import sys
class BackendThread(QThread):
update_date = pyqtSignal(str)
def run(self):
while True:
data = QDateTime.currentDateTime()
currentTime = data.toString("yyyy-MM-dd hh:mm:ss")
self.update_date.emit(str(currentTime))
class ThreadUpdateUI(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setWindowTitle("多线程UI更新")
self.resize(400, 100)
self.input = QLineEdit(self)
self.input.resize(400, 100)
self.initUI()
def initUI(self):
self.backend = BackendThread()
self.backend.update_date.connect(self.handledisplay)
self.backend.start()
def handledisplay(self, data):
self.input.setText(data)
if __name__ == "__main__":
app = QApplication(sys.argv)
example = ThreadUpdateUI()
example.show()
sys.exit(app.exec())
信号和槽自动连接
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
import sys
class AutoSingalSlot(QWidget):
def __init__(self):
super(AutoSingalSlot, self).__init__()
self.okbutton = QPushButton("ok", self)
self.okbutton.setObjectName("okbutton")
self.cancelbutton = QPushButton("cancel", self)
self.cancelbutton.setObjectName("cancelbutton")
layout = QHBoxLayout()
layout.addWidget(self.okbutton)
layout.addWidget(self.cancelbutton)
self.setLayout(layout)
QtCore.QMetaObject.connectSlotsByName(self)
@QtCore.pyqtSlot()
def on_okbutton_clicked(self):
print("点击了ok按钮")
@QtCore.pyqtSlot()
def on_cancelbutton_clicked(self):
print("点击了cancel按钮")
if __name__ == "__main__":
app = QApplication(sys.argv)
example = AutoSingalSlot()
example.show()
sys.exit(app.exec())
lambda匿名表达式给槽函数传参
from PyQt5.QtWidgets import *
import sys
class LambdaSlotArg(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("使用lambda表达式为槽函数传递参数")
button1 = QPushButton("按钮1")
button2 = QPushButton("按钮2")
button1.clicked.connect(lambda: self.onButtonClick(10, 20))
button2.clicked.connect(lambda: self.onButtonClick(-200, 20))
button1.clicked.connect(lambda: QMessageBox.information(self, "结果", "单击了button1"))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
def onButtonClick(self, m, n):
print("m + n", str(m + n))
QMessageBox.information(self, "结果", str(m + n))
if __name__ == "__main__":
app = QApplication(sys.argv)
example = LambdaSlotArg()
example.show()
sys.exit(app.exec())
partial给槽函数传参
from PyQt5.QtWidgets import *
import sys
from functools import partial
class LambdaSlotArg(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("使用partial为槽函数传递参数")
button1 = QPushButton("按钮1")
button2 = QPushButton("按钮2")
button1.clicked.connect(partial(self.onButtonClick, 10, 20))
button2.clicked.connect(partial(self.onButtonClick, -200, 20))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
def onButtonClick(self, m, n):
print("m + n", str(m + n))
QMessageBox.information(self, "结果", str(m + n))
if __name__ == "__main__":
app = QApplication(sys.argv)
example = LambdaSlotArg()
example.show()
sys.exit(app.exec())
override(覆盖)槽函数
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class OverrideSlot(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Override(覆盖)槽函数")
def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape:
self.close()
elif e.key() == Qt.Key_Alt:
self.setWindowTitle("按下ALT键")
if __name__ == "__main__":
app = QApplication(sys.argv)
example = OverrideSlot()
example.show()
sys.exit(app.exec())