PyQt - สัญญาณและสล็อต
แตกต่างจากแอปพลิเคชันโหมดคอนโซลซึ่งดำเนินการในลักษณะตามลำดับแอปพลิเคชันที่ใช้ GUI จะขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชันหรือวิธีการทำงานเพื่อตอบสนองต่อการกระทำของผู้ใช้เช่นการคลิกที่ปุ่มเลือกรายการจากคอลเลกชันหรือการคลิกเมาส์เป็นต้นเรียกว่าevents.
วิดเจ็ตที่ใช้สร้างอินเทอร์เฟซ GUI ทำหน้าที่เป็นแหล่งที่มาของเหตุการณ์ดังกล่าว วิดเจ็ต PyQt แต่ละอันซึ่งมาจากคลาส QObject ได้รับการออกแบบมาเพื่อปล่อย 'signal'เพื่อตอบสนองต่อเหตุการณ์อย่างน้อยหนึ่งเหตุการณ์ สัญญาณในตัวเองไม่ได้ดำเนินการใด ๆ แต่จะ 'เชื่อมต่อ' กับ a 'slot'. สล็อตสามารถเป็นอย่างไรก็ได้callable Python function.
ใน PyQt การเชื่อมต่อระหว่างสัญญาณและสล็อตสามารถทำได้หลายวิธี ต่อไปนี้เป็นเทคนิคที่ใช้บ่อยที่สุด -
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
วิธีที่สะดวกกว่าในการเรียก slot_function เมื่อสัญญาณถูกปล่อยออกมาจากวิดเจ็ตมีดังนี้ -
widget.signal.connect(slot_function)
สมมติว่าจะเรียกใช้ฟังก์ชันเมื่อมีการคลิกปุ่ม ที่นี่สัญญาณที่คลิกจะเชื่อมต่อกับฟังก์ชันที่โทรได้ สามารถทำได้ในสองเทคนิคต่อไปนี้ -
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
หรือ
button.clicked.connect(slot_function)
ตัวอย่าง
ในตัวอย่างต่อไปนี้อ็อบเจ็กต์ QPushButton สองตัว (b1 และ b2) ถูกเพิ่มในหน้าต่าง QDialog เราต้องการเรียกใช้ฟังก์ชัน b1_clicked () และ b2_clicked () เมื่อคลิก b1 และ b2 ตามลำดับ
เมื่อคลิก b1 สัญญาณคลิก () จะเชื่อมต่อกับฟังก์ชัน b1_clicked ()
b1.clicked.connect(b1_clicked())
เมื่อคลิก b2 สัญญาณคลิก () จะเชื่อมต่อกับฟังก์ชัน b2_clicked ()
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
ตัวอย่าง
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
def b2_clicked():
print "Button 2 clicked"
if __name__ == '__main__':
window()
รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ -
เอาต์พุต
Button 1 clicked
Button 2 clicked