訊號與槽 高階應用

2022-06-13 18:36:08 字數 4025 閱讀 9120

1. 高階自定義訊號與槽

自定義訊號的一般流程:

1)定義訊號

2)定義槽函式

3)連線訊號與槽函式

4)發射訊號

例項

import

sysfrom 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 表示式。

import

sysfrom 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 函式。

import

sysfrom 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中有些類會自帶有一些訊號和槽函式,當然訊號和槽函式也可以自己定義。下面來看下很簡單的 會...