Phát ra trong trăn

Trong phần này của hướng dẫn lập trình PyQt5, chúng ta khám phá các sự kiện và tín hiệu xảy ra trong các ứng dụng

Các ứng dụng GUI được điều khiển theo sự kiện. Các sự kiện được tạo chủ yếu bởi người dùng ứng dụng. Nhưng chúng cũng có thể được tạo ra bằng các phương tiện khác; . g. kết nối Internet, trình quản lý cửa sổ hoặc bộ hẹn giờ. Khi chúng ta gọi phương thức sld.valueChanged.connect(lcd.display) 5 của ứng dụng, ứng dụng sẽ vào vòng lặp chính. Vòng lặp chính tìm nạp các sự kiện và gửi chúng đến các đối tượng

Trong mô hình sự kiện, có ba người tham gia

  • nguồn sự kiện
  • đối tượng sự kiện
  • mục tiêu sự kiện

Nguồn sự kiện là đối tượng có trạng thái thay đổi. Nó tạo ra các sự kiện. Đối tượng sự kiện (event) gói gọn các thay đổi trạng thái trong nguồn sự kiện. Mục tiêu sự kiện là đối tượng muốn được thông báo. Đối tượng nguồn sự kiện ủy quyền nhiệm vụ xử lý sự kiện cho mục tiêu sự kiện

PyQt5 có cơ chế khe và tín hiệu duy nhất để xử lý các sự kiện. Tín hiệu và khe cắm được sử dụng để liên lạc giữa các đối tượng. Một tín hiệu được phát ra khi một sự kiện cụ thể xảy ra. Một vị trí có thể là bất kỳ Python nào có thể gọi được. Một khe cắm được gọi khi tín hiệu được kết nối của nó được phát ra

Tín hiệu và khe cắm PyQt5

Đây là một ví dụ đơn giản thể hiện tín hiệu và vị trí trong PyQt5

#!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we connect a signal of a QSlider to a slot of a QLCDNumber. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider, QVBoxLayout, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lcd = QLCDNumber(self) sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) sld.valueChanged.connect(lcd.display) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Signal and slot') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()

Trong ví dụ của chúng tôi, chúng tôi hiển thị một sld.valueChanged.connect(lcd.display) 6 và một sld.valueChanged.connect(lcd.display) 7. Chúng tôi thay đổi số sld.valueChanged.connect(lcd.display) 8 bằng cách kéo núm trượt

sld.valueChanged.connect(lcd.display)

Ở đây chúng tôi kết nối tín hiệu sld.valueChanged.connect(lcd.display) 9 của thanh trượt với khe #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 0 của số sld.valueChanged.connect(lcd.display) 8

Người gửi là một đối tượng gửi tín hiệu. Máy thu là đối tượng nhận được tín hiệu. Khe là phương thức phản ứng với tín hiệu

Nhân vật. Tín hiệu và khe cắm

Các sự kiện trong PyQt5 thường được xử lý bằng cách triển khai lại các trình xử lý sự kiện

#!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()

Trong ví dụ của chúng tôi, chúng tôi triển khai lại trình xử lý sự kiện #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 2

def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()

Nếu chúng ta nhấp vào nút Escape, ứng dụng sẽ kết thúc

Đối tượng sự kiện trong PyQt5

Đối tượng sự kiện là một đối tượng Python chứa một số thuộc tính mô tả sự kiện. Đối tượng sự kiện dành riêng cho loại sự kiện được tạo

#!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we display the x and y coordinates of a mouse pointer in a label widget. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QLabel class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() x = 0 y = 0 self.text = f'x: {x}, y: {y}' self.label = QLabel(self.text, self) grid.addWidget(self.label, 0, 0, Qt.AlignTop) self.setMouseTracking(True) self.setLayout(grid) self.setGeometry(300, 300, 450, 300) self.setWindowTitle('Event object') self.show() def mouseMoveEvent(self, e): x = e.x() y = e.y() text = f'x: {x}, y: {y}' self.label.setText(text) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()

Trong ví dụ này, chúng tôi hiển thị tọa độ x và y của con trỏ chuột trong tiện ích nhãn

self.text = f'x: {x}, y: {y}' self.label = QLabel(self.text, self)

Tọa độ x và y được hiển thị trong tiện ích #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 3

self.setMouseTracking(True)

Theo dõi chuột bị tắt theo mặc định, do đó, tiện ích chỉ nhận các sự kiện di chuyển chuột khi ít nhất một nút chuột được nhấn trong khi chuột đang được di chuyển. Nếu theo dõi chuột được bật, tiện ích sẽ nhận các sự kiện di chuyển chuột ngay cả khi không có nút nào được nhấn

def mouseMoveEvent(self, e): x = e.x() y = e.y() text = f'x: {x}, y: {y}' self.label.setText(text)

#!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 4 là đối tượng sự kiện; . Với phương pháp #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 5 và #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 6 ta xác định được tọa độ x và y của con trỏ chuột. Chúng tôi xây dựng chuỗi và đặt nó vào tiện ích nhãn

Nhân vật. đối tượng sự kiện

Đôi khi thật thuận tiện để biết tiện ích nào là người gửi tín hiệu. Đối với điều này, PyQt5 có phương thức #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 7

#!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we determine the event sender object. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): btn1 = QPushButton("Button 1", self) btn1.move(30, 50) btn2 = QPushButton("Button 2", self) btn2.move(150, 50) btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) self.statusBar() self.setGeometry(300, 300, 450, 350) self.setWindowTitle('Event sender') self.show() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' was pressed') def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()

Chúng tôi có hai nút trong ví dụ của chúng tôi. Trong phương thức #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 8, chúng tôi xác định nút nào chúng tôi đã nhấp bằng cách gọi phương thức #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 7

btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked)

Cả hai nút được kết nối với cùng một khe cắm

sld.valueChanged.connect(lcd.display) 0

Chúng tôi xác định nguồn tín hiệu bằng cách gọi phương thức #!/usr/bin/python """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 7. Trong thanh trạng thái của ứng dụng, chúng tôi hiển thị nhãn của nút đang được nhấn

Nhân vật. người gửi sự kiện

Tín hiệu phát PyQt5

Các đối tượng được tạo từ một def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 1 có thể phát ra tín hiệu. Ví dụ sau đây cho thấy cách chúng tôi phát ra các tín hiệu tùy chỉnh

sld.valueChanged.connect(lcd.display) 1

Chúng tôi tạo một tín hiệu mới có tên là def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 2. Tín hiệu này được phát ra trong một sự kiện nhấn chuột. Tín hiệu được kết nối với khe cắm def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 3 của def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 4

sld.valueChanged.connect(lcd.display) 2

Một tín hiệu được tạo với def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 5 như một thuộc tính lớp của lớp def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 6 bên ngoài

sld.valueChanged.connect(lcd.display) 3

Tín hiệu def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 2 tùy chỉnh được kết nối với khe cắm def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 3 của def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 4

sld.valueChanged.connect(lcd.display) 4

Khi chúng tôi nhấp vào cửa sổ bằng con trỏ chuột, tín hiệu def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() 2 được phát ra. ứng dụng chấm dứt

Pyqtsignal trong Python là gì?

Mỗi tiện ích PyQt, có nguồn gốc từ lớp QObject, được thiết kế để phát ra 'tín hiệu' để phản hồi lại một hoặc nhiều sự kiện . Bản thân tín hiệu 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 một 'khe cắm'. Vị trí có thể là bất kỳ chức năng Python có thể gọi nào.

Tín hiệu PyQt5 là gì?

PyQt5 có cơ chế khe và tín hiệu duy nhất để xử lý các sự kiện. Tín hiệu và khe cắm được sử dụng để liên lạc giữa các đối tượng. Tín hiệu được phát ra khi một sự kiện cụ thể xảy ra . Một vị trí có thể là bất kỳ Python nào có thể gọi được. Một khe cắm được gọi khi tín hiệu được kết nối của nó được phát ra.

Chủ đề