<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # PySide 中的事件和信號 > 原文: [http://zetcode.com/gui/pysidetutorial/eventsandsignals/](http://zetcode.com/gui/pysidetutorial/eventsandsignals/) 在 PySide 編程教程的這一部分中,我們將探討應用中發生的事件和信號。 ## 事件 事件是任何 GUI 程序中的重要組成部分。 事件是由用戶或系統生成的。 當我們調用應用的`exec_()`方法時,應用進入主循環。 主循環獲取事件并將其發送到對象。 PySide 具有獨特的信號和槽機制。 所有 GUI 應用都是事件驅動的。 應用會對在其生命周期內生成的不同事件類型做出反應。 事件主要由應用的用戶生成。 但是它們也可以通過其他方式生成。 例如互聯網連接,窗口管理器,計時器。 在事件模型中,有三個參與者: * 事件來源 * 事件對象 * 事件目標 `event source`是狀態改變的對象。 它生成事件。 `event object`(事件)將狀態更改封裝在事件源中。 `event target`是要通知的對象。 事件源對象將處理事件的任務委托給事件目標。 當我們調用應用的`exec_()`方法時,應用進入主循環。 主循環獲取事件并將其發送到對象。 信號和槽用于對象之間的通信。 發生特定事件時會發出`signal`。 `slot`可以是任何 Python 可調用的。 當發出與其連接的信號時,將調用槽。 ## 信號和槽 這是一個簡單的示例,展示了 PySide 中的信號和槽。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PySide 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: August 2011 """ import sys from PySide 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`槽。 `sender`是發送信號的對象。 `receiver`是接收信號的對象。 `slot`是對信號做出反應的方法。 ![Signals & slot](https://img.kancloud.cn/1b/61/1b616a85bc51521f51ce74c810830116_258x178.jpg) 圖:信號和槽 ## 重新實現事件處理器 PySide 中的事件通常通過重新實現事件處理器來處理。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PySide tutorial In this example, we reimplement an event handler. author: Jan Bodnar website: zetcode.com last edited: August 2011 """ import sys from PySide 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() ``` 如果單擊退出按鈕,則應用終止。 ## 事件發送者 有時很容易知道哪個控件是信號的發送者。 為此,PySide 具有`sender()`方法。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PySide tutorial In this example, we determine the event sender object. author: Jan Bodnar website: zetcode.com last edited: August 2011 """ import sys from PySide 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`創建的對象可以發出信號。 如果單擊按鈕,將生成`clicked`信號。 在下面的示例中,我們將看到如何發出自定義信號。 ```py #!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PySide tutorial In this example, we show how to emit a signal. author: Jan Bodnar website: zetcode.com last edited: August 2011 """ import sys from PySide import QtGui, QtCore class Communicate(QtCore.QObject): closeApp = QtCore.Signal() 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.Signal() ``` 我們基于`QtCore.QObject`創建一個類。 實例化時會創建一個`closeApp`信號。 ```py self.c = Communicate() self.c.closeApp.connect(self.close) ``` 創建`Communicate`類的實例。 我們將`QtGui.QMainWindow`的`close()`槽連接到 closeApp 信號。 ```py def mousePressEvent(self, event): self.c.closeApp.emit() ``` 當我們用鼠標指針單擊窗口時,會發出`closeApp`信號。 在 PySide 教程的這一部分中,我們介紹了信號和槽。
                  <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>

                              哎呀哎呀视频在线观看