1. 高階自定義訊號與槽
自定義訊號的一般流程:
1)定義訊號
2)定義槽函式
3)連線訊號與槽函式
4)發射訊號
例項
importsysfrom pyqt5.qtcore import
pyqtsignal, qobject
class
custsignal(qobject):
#宣告無引數的訊號
signal1 =pyqtsignal()
#宣告帶乙個int型別引數的訊號
signal2 =pyqtsignal(int)
#宣告帶int和str型別引數的訊號
signal3 =pyqtsignal(int, str)
#宣告帶乙個列表型別引數的訊號
signal4 =pyqtsignal(list)
#宣告帶乙個字典型別引數的訊號
signal5 =pyqtsignal(dict)
#宣告帶乙個多過載版本的訊號,包括帶int和str型別引數的訊號和帶str型別引數的訊號
signal6 =pyqtsignal([int, str], [str])
def__init__(self, parent=none):
super().
__init__
(parent)
#將訊號連線到指定槽函式
self.signal1.connect(self.signalcall1)
self.signal2.connect(self.signalcall2)
self.signal3.connect(self.signalcall3)
self.signal4.connect(self.signalcall4)
self.signal5.connect(self.signalcall5)
self.signal6[int, str].connect(self.signalcall6)
self.signal6[str].connect(self.signalcall6overload)
#發射訊號
self.signal1.emit()
self.signal2.emit(1)
self.signal3.emit(1, "
text")
self.signal4.emit([1, 2, 3, 4])
self.signal5.emit()
self.signal6[int, str].emit(1, "
text")
self.signal6[str].emit(
"text")
defsignalcall1(self):
print("
signal1 emit")
defsignalcall2(self, val):
print("
signal2 emit, value:
", val)
defsignalcall3(self, val, text):
print("
signal3 emit, value:
", val, text)
defsignalcall4(self, val):
print("
signal4 emit, value:
", val)
defsignalcall5(self, val):
print("
signal5 emit, value:
", val)
defsignalcall6(self, val, text):
print("
signal6 emit, value:
", val, text)
defsignalcall6overload(self, val):
print("
signal6 overload emit, value:
", val)
if__name__ == "
__main__":
custsignal = custsignal()
2. 使用自定義引數
解決訊號發出的引數個數小於槽函式接收的引數個數的兩種方法,重點是自定義引數的傳遞:
1. 使用 lambda 表示式。
importsysfrom pyqt5.qtwidgets import
class
winform(qmainwindow):
def__init__(self, parent=none):
super().
__init__
(parent)
btn1 = qpushbutton("
button 1")
btn2 = qpushbutton("
button 2")
btn1.clicked.connect(
lambda: self.onbuttonclick(1))
btn2.clicked.connect(
lambda: self.onbuttonclick(2))
layout =qhboxlayout()
layout.addwidget(btn1)
layout.addwidget(btn2)
main_form =qwidget()
main_form.setlayout(layout)
self.setcentralwidget(main_form)
defonbuttonclick(self, n):
print("
button 被按下了
".format(n))
qmessagebox.information(self,
"資訊提示框
", "
button clicked
".format(n))
if__name__ == "
__main__":
win =winform()
win.show()
2. 使用functools 中的 partial 函式。
importsysfrom pyqt5.qtwidgets import
from functools import
partial
class
winform(qmainwindow):
def__init__(self, parent=none):
super().
__init__
(parent)
btn1 = qpushbutton("
button 1")
btn2 = qpushbutton("
button 2")
btn1.clicked.connect(partial(self.onbuttonclick, 1))
btn2.clicked.connect(partial(self.onbuttonclick, 2))
layout =qhboxlayout()
layout.addwidget(btn1)
layout.addwidget(btn2)
main_form =qwidget()
main_form.setlayout(layout)
self.setcentralwidget(main_form)
defonbuttonclick(self, n):
print("
button 被按下了
".format(n))
qmessagebox.information(self,
"資訊提示框
", "
button clicked
".format(n))
if__name__ == "
__main__":
win =winform()
win.show()
訊號與槽 入門應用
訊號 signal 和槽 slot 是qt的核心機制。在建立事件迴圈之後,通過建立訊號和槽的連線就可以實現物件之間的通訊。當訊號發射 emit 時,連線的槽函式將會自動執行。在pyqt5中,訊號和槽通過qobject.signal.connect 連線。所有從qobject類或其子類 如qwidge...
qt 槽與訊號
槽就是乙個可以被呼叫處理特定訊號的函式 乙個小的qt類如下 class foo public qobject public slots void setvalue int signals void valuechanged int private int val qt中的元物件系統是用來處理物件間通...
QT訊號與槽
初學qt,覺得理解qt訊號與槽比較重要,qt很多時候都需要用到訊號和槽。發射訊號會觸發相對應的槽函式的執行。乙個訊號可以對應多個槽,多個訊號可以對應乙個槽。訊號和槽是通過connect這個方法進行建立聯絡的。qt中有些類會自帶有一些訊號和槽函式,當然訊號和槽函式也可以自己定義。下面來看下很簡單的 會...