PyQt5 - สัญญาณและสล็อต

แตกต่างจากแอปพลิเคชันโหมดคอนโซลซึ่งดำเนินการในลักษณะตามลำดับแอปพลิเคชันที่ใช้ GUI จะขับเคลื่อนด้วยเหตุการณ์ ฟังก์ชันหรือวิธีการทำงานเพื่อตอบสนองต่อการกระทำของผู้ใช้เช่นการคลิกที่ปุ่มเลือกรายการจากคอลเลกชันหรือการคลิกเมาส์เป็นต้นเรียกว่าevents.

วิดเจ็ตที่ใช้สร้างอินเทอร์เฟซ GUI ทำหน้าที่เป็นแหล่งที่มาของเหตุการณ์ดังกล่าว วิดเจ็ต PyQt แต่ละตัวซึ่งมาจากคลาส QObject ได้รับการออกแบบมาเพื่อปล่อย‘signal’เพื่อตอบสนองต่อเหตุการณ์อย่างน้อยหนึ่งเหตุการณ์ สัญญาณในตัวเองไม่ได้ดำเนินการใด ๆ แต่จะ 'เชื่อมต่อ' กับไฟล์‘slot’. สล็อตสามารถเป็นอย่างไรก็ได้callable Python function.

การใช้ตัวแก้ไขสัญญาณ / สล็อตของนักออกแบบ Qt

ขั้นแรกให้ออกแบบรูปแบบง่ายๆด้วยตัวควบคุม LineEdit และ PushButton

เป็นที่ต้องการว่าหากกดปุ่มเนื้อหาของกล่องข้อความควรถูกลบ วิดเจ็ต QLineEdit มีเมธอด clear () สำหรับวัตถุประสงค์นี้ ดังนั้นปุ่มclicked สัญญาณจะเชื่อมต่อกับ clear() วิธีการของกล่องข้อความ

ในการเริ่มต้นให้เลือกแก้ไขสัญญาณ / สล็อตจากเมนูแก้ไข (หรือกด F4) จากนั้นไฮไลต์ปุ่มด้วยเมาส์แล้วลากเคอร์เซอร์ไปที่กล่องข้อความ

เมื่อปล่อยเมาส์กล่องโต้ตอบที่แสดงสัญญาณของปุ่มและวิธีการของสล็อตจะปรากฏขึ้น เลือก clicked signal และ clear () method

หน้าต่าง Signal / Slot Editor ที่ด้านล่างขวาจะแสดงผลลัพธ์ -

บันทึกรหัส ui และ Build และ Python จากไฟล์ ui ดังที่แสดงในโค้ดด้านล่าง -

pyuic5 -x signalslot.ui -o signalslot.py

รหัส Python ที่สร้างขึ้นจะมีการเชื่อมต่อระหว่างสัญญาณและสล็อตโดยคำสั่งต่อไปนี้ -

self.pushButton.clicked.connect(self.lineEdit.clear)

เรียกใช้ signallot.py และป้อนข้อความใน LineEdit ข้อความจะถูกล้างหากกดปุ่ม

การสร้างการเชื่อมต่อช่องสัญญาณ

แทนที่จะใช้ Designer คุณสามารถสร้างการเชื่อมต่อช่องสัญญาณได้โดยตรงโดยทำตามไวยากรณ์ -

widget.signal.connect(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 ()

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   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