<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # PyQt5 中的事件和信號 > 原文: [http://zetcode.com/gui/pyqt5/eventssignals/](http://zetcode.com/gui/pyqt5/eventssignals/) 在 PyQt5 編程教程的這一部分中,我們將探討應用中發生的事件和信號。 ## 事件 GUI 應用是事件驅動的。 事件主要由應用的用戶生成。 但是它們也可以通過其他方式生成。 例如互聯網連接,窗口管理器或計時器。 當我們調用應用的`exec_()`方法時,應用進入主循環。 主循環獲取事件并將其發送到對象。 在事件模型中,有三個參與者: * 事件來源 * 事件對象 * 事件目標 事件源是狀態更改的對象。 它生成事件。事件對象(事件)將狀態更改封裝在事件源中。事件目標是要通知的對象。 事件源對象將處理事件的任務委托給事件目標。 PyQt5 具有獨特的信號和槽機制來處理事件。 信號和槽用于對象之間的通信。 當發生特定事件時,會發出信號。槽可以是任何 Python 可調用的。 發出連接信號時,將調用槽。 ## 信號和槽 這是一個簡單的示例,展示了 PyQt5 中的信號和槽。 `sigslot.py` ```py #!/usr/bin/python3 # -*- coding: utf-8 -*- """ 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 Last edited: January 2017 """ 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() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 在我們的示例中,我們顯示`QtGui.QLCDNumber`和`QtGui.QSlider`。 我們通過拖動滑塊來更改`lcd`編號。 ```py sld.valueChanged.connect(lcd.display) ``` 在這里,我們將滑塊的`valueChanged`信號連接到`lcd`號的`display`槽。 發送器是發送信號的對象。接收器是接收信號的對象。槽是對信號做出反應的方法。 ![Signal & slot](https://img.kancloud.cn/48/f5/48f53acdf9902f820253163ec1797646_252x175.jpg) 圖:信號和槽 ## 重新實現事件處理器 PyQt5 中的事件通常通過重新實現事件處理器來處理。 `escape.py` ```py #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we reimplement an event handler. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ 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() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 在我們的示例中,我們重新實現了`keyPressEvent()`事件處理器。 ```py def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close() ``` 如果單擊“退出”按鈕,則應用終止。 ## 事件對象 事件對象是一個 Python 對象,其中包含許多描述事件的屬性。 事件對象特定于生成的事件類型。 `eventobject.py` ```py #!/usr/bin/python3 # -*- coding: utf-8 -*- """ 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 Last edited: August 2017 """ 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 = "x: {0}, y: {1}".format(x, 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, 350, 200) self.setWindowTitle('Event object') self.show() def mouseMoveEvent(self, e): x = e.x() y = e.y() text = "x: {0}, y: {1}".format(x, y) self.label.setText(text) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 在此示例中,我們在標簽小部件中顯示了鼠標指針的 x 和 y 坐標。 ```py self.text = "x: {0}, y: {1}".format(x, y) self.label = QLabel(self.text, self) ``` x 和 y 坐標顯示在`QLabel`小部件中。 ```py self.setMouseTracking(True) ``` 默認情況下,鼠標跟蹤是禁用的,因此,僅在移動鼠標時按下至少一個鼠標按鈕時,窗口小部件才會接收鼠標移動事件。 如果啟用了鼠標跟蹤,則即使未按任何按鈕,窗口小部件也會接收鼠標移動事件。 ```py def mouseMoveEvent(self, e): x = e.x() y = e.y() text = "x: {0}, y: {1}".format(x, y) self.label.setText(text) ``` `e`是事件對象; 它包含有關已觸發事件的數據; 在我們的例子中,是一個鼠標移動事件。 使用`x()`和`y()`方法,我們可以確定鼠標指針的 x 和 y 坐標。 我們構建字符串并將其設置為標簽小部件。 ![Event object](https://img.kancloud.cn/63/26/63267fbb7bcdbf95fb2633b29934cc41_352x225.jpg) 圖:事件對象 ## 事件發送者 有時很方便地知道哪個窗口小部件是信號的發送者。 為此,PyQt5 具有`sender()`方法。 `eventsource.py` ```py #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we determine the event sender object. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ 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, 290, 150) self.setWindowTitle('Event sender') self.show() def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' was pressed') if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 我們的示例中有兩個按鈕。 在`buttonClicked()`方法中,我們通過調用`sender()`方法來確定單擊了哪個按鈕。 ```py btn1.clicked.connect(self.buttonClicked) btn2.clicked.connect(self.buttonClicked) ``` 兩個按鈕都連接到同一槽。 ```py def buttonClicked(self): sender = self.sender() self.statusBar().showMessage(sender.text() + ' was pressed') ``` 我們通過調用`sender()`方法來確定信號源。 在應用的狀態欄中,我們顯示了被按下的按鈕的標簽。 ![Event sender](https://img.kancloud.cn/20/9a/209a2c7b65f0bca7d865236d92b251c3_292x176.jpg) 圖:事件發送者 ## 發射信號 從`QObject`創建的對象可以發出信號。 以下示例說明了如何發出自定義信號。 `customsignal.py` ```py #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we show how to emit a custom signal. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QMainWindow, QApplication class Communicate(QObject): closeApp = pyqtSignal() class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.c = Communicate() self.c.closeApp.connect(self.close) self.setGeometry(300, 300, 290, 150) self.setWindowTitle('Emit signal') self.show() def mousePressEvent(self, event): self.c.closeApp.emit() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) ``` 我們創建一個名為`closeApp`的新信號。 在鼠標按下事件期間發出此信號。 信號連接到`QMainWindow`的`close()`槽。 ```py class Communicate(QObject): closeApp = pyqtSignal() ``` 使用`pyqtSignal()`作為外部`Communicate`類的類屬性創建信號。 ```py self.c = Communicate() self.c.closeApp.connect(self.close) ``` 定制的`closeApp`信號連接到`QMainWindow`的`close()`槽。 ```py def mousePressEvent(self, event): self.c.closeApp.emit() ``` 當我們用鼠標指針單擊窗口時,會發出`closeApp`信號。 該應用終止。 在 PyQt5 教程的這一部分中,我們介紹了信號和槽。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看