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

Signal & slotNhâ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

Event objectNhâ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

Event senderNhâ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.