• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 41, 文章 - 8, 評論 - 8, 引用 - 0
            數(shù)據(jù)加載中……

            [Python][PyQt4]PyQt4 中的事件和信號

            PyQt4 中的事件和信號

            在本部分,我們將會探討事件和信號。

            事件

            在任何的 GUI 程序中,事件是很重要的部分。事件是由用戶或操作系統(tǒng)產(chǎn)生的。當我們調(diào)用應(yīng)用的 exec_() 時,應(yīng)用就進入了主循環(huán)。主循環(huán)會接受事件并且把它們發(fā)送給對象。Trolltech 引入了一個獨特的信號和槽機制。

            事件是任何 GUI 程序中很重要的部分。所有 GUI 應(yīng)用都是事件驅(qū)動的。一個應(yīng)用對其生命期產(chǎn)生的不同的事件類型做出反應(yīng)。事件是主要由應(yīng)用的用戶產(chǎn)生。但是,也可以通過其他方法產(chǎn)生,比如,網(wǎng)絡(luò)通信,窗口的管理者,計時器。在事件模型中,有三個參與者:

            • 事件源(event source)
            • 事件對象(event object)
            • 事件目標(event target)

            event source 是那些狀態(tài)改變的對象。它產(chǎn)生事件。而 event object (Event)封裝了事件源的狀態(tài)改變。而 event target 則是需要被通知的。事件源把處理事件的任務(wù)委托給了事件目標。

            當我們調(diào)用了應(yīng)用的 exec_() 方法,應(yīng)用就進入主循環(huán)了。主循環(huán)接受事件然后把他們發(fā)送給對象。信號和槽用于對象間的通信。當特定的事件發(fā)生時 信號 就被發(fā)送了。而 則是任何 Python 中可調(diào)用的。當信號發(fā)送給了這個槽,槽就被調(diào)用了。

            新的 API

            PyQt 4.5 引入了新的 API 用于信號和槽。

            QtCore.QObject.connect(button, QtCore.SIGNAL('clicked()'), self.onClicked)
            

            這是舊式的 API 。

            button.clicked.connect(self.onClicked)
            

            新式的更接近 Python 的標準。

            信號與槽

            這是一個簡單的例子,描述 PyQt4 中的信號和槽。

            #!/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.QLCDNumberQtGui.QSlider 。通過拖拽滑塊,我們就可以更改 lcd 的數(shù)字。

            sld.valueChanged.connect(lcd.display)
            

            此處,我們把 slider 的信號 valueChanged 和 lcd 的槽 display 連接了起來。

            sender 是發(fā)送信號的對象。 receiver 是接受信號的對象。而 slot 是回饋信號的方法。

            重新實現(xiàn)事件處理句柄

            在 PyQt4 中事件的處理一般通過重新實現(xiàn)事件的句柄。

            #!/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()
            

            在我們的例子中,我們重新實現(xiàn)了 keyPressEvent()

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

            如果我們按 escape 鍵,那么應(yīng)用就將終止。

            事件發(fā)送者

            有些時候,知道信號的發(fā)送者是很方便的。因此,PyQt4 有個 sender() 方法。

            #!/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() 方法中,我們通過調(diào)用 sender() 方法知道了哪個按鈕被點擊了。

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

            兩個按鈕都連接到相同的槽中。

            def buttonClicked(self):
                sender = self.sender()
                self.statusBar().showMessange(sender.text() + " was pressed")
            

            我們通過調(diào)用 sender() 方法知道了消息源。在狀態(tài)欄中,我們顯示了被按的按鈕的標簽。

            發(fā)送信號

            QtCore.QObject 創(chuàng)建的對象可以發(fā)送信號。如果我們點擊按鈕,一個 clicked() 信號就被生成。在下面的例子中我們將看到如何發(fā)送信號。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            In this example, we show how to emit a
            custom signal.
            author: Jan Bodnar
            website: zetcode.com
            last edited: October 2011
            """
            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()
            

            我們創(chuàng)建了一個新的信號稱為 closeApp 。這個信號在鼠標點擊時將被發(fā)送。而這個信號又和 QtGui.QMainWindowclose() 槽相連接。

            class Communicate(QtCore.QObject):
                closeApp = QtCore.pyqtSignal()
            

            我們創(chuàng)建了基于 QtCore.QObject 的類。當它被實例化后就創(chuàng)建了一個 closeApp 信號。

            self.c = Communicate()
            self.c.closeApp.connect(self.close)
            

            Communicate 的實例就被創(chuàng)建了。我們把 QtGui.QMainWindowclose() 槽連接到信號 closeApp 上。

            def mousePressEvent(self, event):
                self.c.closeApp.emit()
            

            當鼠標指針在窗口中點擊,信號 closeApp 就被發(fā)送了。


            在這個部分,我們涉及了信號與槽。

            posted on 2012-02-05 10:05 mirguest 閱讀(14981) 評論(0)  編輯 收藏 引用 所屬分類: Python

            狠狠色丁香久久婷婷综合蜜芽五月| 国内精品久久久久久久久| 亚洲AV无码久久精品狠狠爱浪潮| 久久精品国产亚洲av麻豆图片 | 久久精品无码一区二区无码| 狠狠色婷婷综合天天久久丁香| 国产精品免费久久久久影院| 一级a性色生活片久久无 | 99久久99久久精品国产片果冻| 久久综合色区| 久久精品国产精品亚洲精品| 香蕉久久AⅤ一区二区三区| 久久精品人人做人人爽电影| 久久影院久久香蕉国产线看观看| 欧美大香线蕉线伊人久久| 久久久久一本毛久久久| 狠狠色丁香久久婷婷综| 亚洲αv久久久噜噜噜噜噜| 久久久久亚洲AV成人网| 99精品国产在热久久| 久久久久久久精品成人热色戒| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久久久久久久久久久久久| 亚洲天堂久久精品| 国产成人精品白浆久久69| 无码国内精品久久综合88| 老司机午夜网站国内精品久久久久久久久| 久久精品国产精品亚洲毛片| 亚洲狠狠婷婷综合久久蜜芽| 久久久久高潮综合影院| 亚洲综合熟女久久久30p| 精品国产99久久久久久麻豆| 亚洲欧美久久久久9999| 午夜视频久久久久一区| 思思久久99热免费精品6| 四虎久久影院| 97精品国产97久久久久久免费| 18禁黄久久久AAA片| 久久久一本精品99久久精品66| 国内精品久久久久影院日本| 国产精品无码久久综合|