PyQt - 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.
Trong PyQt, kết nối giữa tín hiệu và khe cắm có thể đạt được theo nhiều cách khác nhau. Sau đây là các kỹ thuật thường được sử dụng nhất:
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
Một cách thuận tiện hơn để gọi slot_ function, khi một tín hiệu được phát ra bởi widget như 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:
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
hoặc là
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 ()
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
Thí dụ
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()
Đoạn mã trên tạo ra kết quả sau:
Đầu ra
Button 1 clicked
Button 2 clicked