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