PyQt5 - Tín hiệu & khe cắm

Không giống như ứng dụng ở chế độ console, được thực thi theo cách tuần tự, ứng dụng dựa trên GUI được điều khiển bởi sự kiện. Các hàm hoặc phương thức được thực thi để đáp lại các hành động của người dùng như nhấp vào nút, chọn một mục từ bộ sưu tập hoặc nhấp chuột, v.v., được gọi làevents.

Các widget được sử dụng để xây dựng giao diện GUI hoạt động như nguồn của các sự kiện như vậy. Mỗi tiện ích PyQt, có nguồn gốc từ lớp QObject, được thiết kế để phát ra‘signal’để đáp ứng một hoặc nhiều sự kiện. Tín hiệu tự nó không thực hiện bất kỳ hành động nào. Thay vào đó, nó được 'kết nối' với‘slot’. Khe có thể là bất kỳcallable Python function.

Sử dụng Trình chỉnh sửa khe cắm / tín hiệu của nhà thiết kế Qt

Đầu tiên, hãy thiết kế một biểu mẫu đơn giản với điều khiển LineEdit và PushButton.

Mong muốn rằng nếu nút được nhấn, nội dung của hộp văn bản sẽ bị xóa. Tiện ích QLineEdit có phương thức clear () cho mục đích này. Do đó, nút củaclicked tín hiệu được kết nối với clear() phương thức của hộp văn bản.

Để bắt đầu, hãy chọn Chỉnh sửa tín hiệu / vị trí từ menu Chỉnh sửa (hoặc nhấn F4). Sau đó dùng chuột đánh dấu nút và kéo con trỏ về phía hộp văn bản

Khi thả chuột, một hộp thoại hiển thị các tín hiệu của nút và các phương pháp của vị trí sẽ được hiển thị. Chọn tín hiệu đã nhấp và phương thức clear ()

Cửa sổ Signal / Slot Editor ở dưới cùng bên phải sẽ hiển thị kết quả -

Lưu mã ui và Xây dựng và Python từ tệp ui như được hiển thị trong mã bên dưới:

pyuic5 -x signalslot.ui -o signalslot.py

Mã Python được tạo sẽ có kết nối giữa tín hiệu và khe bằng câu lệnh sau:

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

Chạy signallot.py và nhập một số văn bản vào LineEdit. Văn bản sẽ bị xóa nếu nhấn nút.

Xây dựng kết nối khe cắm tín hiệu

Thay vì sử dụng Trình thiết kế, bạn có thể trực tiếp thiết lập kết nối khe cắm tín hiệu bằng cú pháp sau:

widget.signal.connect(slot_function)

Giả sử nếu một hàm được gọi khi một nút được nhấp. Ở đây, tín hiệu đã nhấp được kết nối với một chức năng có thể gọi được. Nó có thể đạt được bằng bất kỳ kỹ thuật nào sau đây:

button.clicked.connect(slot_function)

Thí dụ

Trong ví dụ sau, hai đối tượng QPushButton (b1 và b2) được thêm vào cửa sổ QDialog. Chúng ta muốn gọi các hàm b1_clicked () và b2_clicked () khi nhấp vào b1 và b2 tương ứng.

Khi b1 được nhấp, tín hiệu được nhấp () được kết nối với hàm b1_clicked () -

b1.clicked.connect(b1_clicked())

Khi b2 được nhấp, tín hiệu được nhấp () được kết nối với hàm 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()

Đoạn mã trên tạo ra kết quả sau:

Đầu ra

Button 1 clicked
Button 2 clicked