<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # PyQt4 中的事件和信號 > 原文: [http://zetcode.com/gui/pyqt4/eventsandsignals/](http://zetcode.com/gui/pyqt4/eventsandsignals/) 在 PyQt4 編程教程的這一部分中,我們將探討應用中發生的事件和信號。 ## 事件 所有 GUI 應用都是事件驅動的。 事件主要由應用的用戶生成。 但是它們也可以通過其他方式生成:例如互聯網連接,窗口管理器或計時器。 當我們調用應用的`exec_()`方法時,應用進入主循環。 主循環獲取事件并將其發送到對象。 在事件模型中,有三個參與者: * 事件來源 * 事件對象 * 事件目標 事件源是狀態更改的對象。 它生成事件。 事件對象(事件)將狀態更改封裝在事件源中。 事件目標是要通知的對象。 事件源對象將處理事件的任務委托給事件目標。 PyQt4 具有獨特的信號和槽機制來處理事件。 信號和槽用于對象之間的通信。 當發生特定事件時,會發出信號。 槽可以是任何 Python 可調用的。 當發出與其連接的信號時,將調用槽。 ## 新 API PyQt4.5 引入了一種用于處理信號和槽的新型 API。 ```py QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), self.onClicked) ``` 這是舊式的 API。 ```py button.clicked.connect(self.onClicked) ``` 新樣式更加符合 Python 標準。 ## 信號和槽 這是一個簡單的示例,展示了 PyQt4 中的信號和槽。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we connect a signal of a QtGui.QSlider to a slot of a QtGui.QLCDNumber. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): lcd = QtGui.QLCDNumber(self) sld = QtGui.QSlider(QtCore.Qt.Horizontal, self) vbox = QtGui.QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) sld.valueChanged.connect(lcd.display) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Signal & slot') self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() ``` 在我們的示例中,我們顯示`QtGui.QLCDNumber`和`QtGui.QSlider`。 我們通過拖動滑塊來更改`lcd`編號。 ```py sld.valueChanged.connect(lcd.display) ``` 在這里,我們將滑塊的`valueChanged`信號連接到`lcd`號的`display`槽。 發送器是發送信號的對象。 接收器是接收信號的對象。 槽是對信號做出反應的方法。 ![Signals & slot](https://img.kancloud.cn/70/fa/70facb004b0851389bf7e9b3edb1017f_258x178.jpg) 圖:信號和槽 ## 重新實現事件處理器 PyQt4 中的事件通常通過重新實現事件處理器來處理。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we reimplement an event handler. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): super(Example, self).__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() == QtCore.Qt.Key_Escape: self.close() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() ``` 在我們的示例中,我們重新實現了`keyPressEvent()`事件處理器。 ```py def keyPressEvent(self, e): if e.key() == QtCore.Qt.Key_Escape: self.close() ``` 如果單擊“退出”按鈕,則應用終止。 ## 事件發送者 有時很方便地知道哪個窗口小部件是信號的發送者。 為此,PyQt4 具有`sender()`方法。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we determine the event sender object. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQt4 import QtGui, QtCore class Example(QtGui.QMainWindow): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): btn1 = QtGui.QPushButton("Button 1", self) btn1.move(30, 50) btn2 = QtGui.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') def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() ``` 我們的示例中有兩個按鈕。 在`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/94/2b/942b8e896721e703d4ff87a580989dcc_298x178.jpg) 圖:事件發送者 ## 發射信號 從`QtCore.QObject`創建的對象可以發出信號。 在下面的示例中,我們將看到如何發出自定義信號。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we show how to emit a signal. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt4 import QtGui, QtCore class Communicate(QtCore.QObject): closeApp = QtCore.pyqtSignal() class Example(QtGui.QMainWindow): def __init__(self): super(Example, self).__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() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() ``` 我們創建一個名為`closeApp`的新信號。 在鼠標按下事件期間發出此信號。 信號連接到`QtGui.QMainWindow`的`close()`槽。 ```py class Communicate(QtCore.QObject): closeApp = QtCore.pyqtSignal() ``` 使用`QtCore.pyqtSignal()`作為外部`Communicate`類的類屬性創建信號。 ```py self.c.closeApp.connect(self.close) ``` 定制的`closeApp`信號連接到`QtGui.QMainWindow`的`close()`槽。 ```py def mousePressEvent(self, event): self.c.closeApp.emit() ``` 當我們用鼠標指針單擊窗口時,會發出`closeApp`信號。 該應用終止。 在 PyQt4 教程的這一部分中,我們介紹了信號和槽。
                  <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>

                              哎呀哎呀视频在线观看