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