青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 41, 文章 - 8, 評論 - 8, 引用 - 0
數據加載中……

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

PyQt4 中的事件和信號

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

事件

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

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

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

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

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

新的 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 的數字。

sld.valueChanged.connect(lcd.display)

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

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

重新實現事件處理句柄

在 PyQt4 中事件的處理一般通過重新實現事件的句柄。

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

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

如果我們按 escape 鍵,那么應用就將終止。

事件發送者

有些時候,知道信號的發送者是很方便的。因此,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() 方法中,我們通過調用 sender() 方法知道了哪個按鈕被點擊了。

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

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

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

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

發送信號

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

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

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

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

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

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

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

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

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


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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品成人播放| 久久婷婷影院| 欧美午夜视频| 暖暖成人免费视频| 久久男人资源视频| 午夜精品久久久| 亚欧美中日韩视频| 欧美一级在线播放| 亚洲欧美日韩视频一区| 亚洲一区二区三区高清 | 欧美一级艳片视频免费观看| 99热这里只有成人精品国产| 一本色道久久综合| 亚洲午夜激情| 久久久亚洲国产美女国产盗摄| 久久综合免费视频影院| 免费影视亚洲| 国产精品看片你懂得| 国产视频在线观看一区| 在线看不卡av| 小辣椒精品导航| 玖玖玖免费嫩草在线影院一区| 亚洲国产精品电影在线观看| 亚洲精品日韩综合观看成人91| 亚洲一区三区在线观看| 亚洲伊人观看| 久久久99国产精品免费| 欧美黄色大片网站| 国产精品视频你懂的| 在线看片成人| 久久精品一本| 国产人成精品一区二区三| 亚洲国产日韩欧美一区二区三区| 一区二区三区高清在线| 牛牛国产精品| 免费视频一区| 91久久精品一区二区三区| 亚洲免费视频成人| 亚洲蜜桃精久久久久久久| 免费成人黄色| 99riav1国产精品视频| 亚洲风情亚aⅴ在线发布| 久久av一区二区三区漫画| 国产毛片久久| 免费在线成人| 欧美国产精品v| 亚洲欧美日韩在线播放| 亚洲影院免费| 激情小说另类小说亚洲欧美| 久久亚洲综合| 欧美激情一区二区在线| 国产精品亚洲综合天堂夜夜 | 亚洲国产中文字幕在线观看| 久久不射中文字幕| 麻豆freexxxx性91精品| 99国产精品私拍| 日韩视频在线免费观看| 欧美激情一区二区三区蜜桃视频| 久久久久久久波多野高潮日日| 亚洲国产成人午夜在线一区| 亚洲欧洲一区| 伊人一区二区三区久久精品| 亚洲国产成人精品久久| 国产精品久久久久久av福利软件 | 国产精品稀缺呦系列在线| 久久理论片午夜琪琪电影网| 欧美电影在线播放| 久久精品一区二区三区不卡牛牛| 久热综合在线亚洲精品| 亚洲欧美在线一区二区| 欧美精品日韩综合在线| 蜜桃久久av| 激情六月综合| 久久久久久噜噜噜久久久精品| 一区二区三区欧美成人| 欧美高清视频www夜色资源网| 久久综合色天天久久综合图片| 国产精品毛片大码女人| 牛牛国产精品| 国产一区二区三区在线观看免费 | 一区二区三区四区国产| 亚洲人成在线观看一区二区| 久久午夜电影网| 久久手机精品视频| 亚洲第一页在线| 欧美搞黄网站| 99在线精品免费视频九九视| 一本色道久久综合| 欧美视频不卡中文| 亚洲欧美激情诱惑| 女主播福利一区| 免费日韩av电影| 久久久精品日韩| 欧美一区二区女人| 国产精品国产三级国产aⅴ入口| 亚洲第一福利在线观看| 国产亚洲aⅴaaaaaa毛片| 午夜精品美女自拍福到在线| 欧美在线观看视频在线| 亚洲黄色免费网站| 欧美视频不卡| 欧美sm极限捆绑bd| 亚洲视频图片小说| 久久五月激情| 亚洲欧美资源在线| 亚洲国产欧美一区| 国产精品无码专区在线观看| 美女视频网站黄色亚洲| 欧美亚洲在线观看| 99v久久综合狠狠综合久久| 久久福利精品| 亚洲一区二区在线免费观看视频 | 一区一区视频| 国产精品在线看| 国产精品v欧美精品v日韩| 免费成人黄色| 欧美激情视频在线播放| 另类酷文…触手系列精品集v1小说| 亚洲天堂成人| av成人黄色| 亚洲综合精品一区二区| 一区二区三区福利| 欧美精品电影在线| 制服诱惑一区二区| a4yy欧美一区二区三区| 亚洲精品一二三| 亚洲欧美日韩第一区| 久久国产日韩| 欧美精品亚洲| 黄色一区二区三区四区| 亚洲国产精品嫩草影院| 一卡二卡3卡四卡高清精品视频| aa亚洲婷婷| 亚洲欧美国产高清| 樱桃视频在线观看一区| 亚洲成人在线| 亚洲品质自拍| 欧美片网站免费| 欧美成人精品不卡视频在线观看 | 亚洲欧美电影在线观看| 久久国产视频网站| 欧美韩日一区| 亚洲综合电影| 欧美女人交a| 在线欧美三区| 久久婷婷av| 亚洲欧美色一区| 欧美日韩中文字幕在线| 国产综合视频| 欧美一级黄色录像| 在线午夜精品| 欧美日韩国产成人精品| 亚洲日韩欧美一区二区在线| 久久综合五月天婷婷伊人| 亚洲愉拍自拍另类高清精品| 欧美精品一区二区三区一线天视频| 国内一区二区在线视频观看| 新片速递亚洲合集欧美合集| 亚洲一区在线观看免费观看电影高清| 欧美国产综合| 一本色道久久| 亚洲永久字幕| 国产一区二区三区自拍| 韩日成人在线| 欧美一二三区精品| 午夜精品国产更新| 在线精品亚洲一区二区| 亚洲激情一区二区| 欧美日韩国产精品一区| 中文精品视频| 久久精品国内一区二区三区| 在线日韩中文字幕| 亚洲精品日本| 国产视频综合在线| 欧美福利一区| 国产精品国产三级国产普通话99| 香蕉国产精品偷在线观看不卡| 欧美在线地址| 亚洲欧美大片| 欧美成人在线免费视频| 午夜精品久久一牛影视| 久热re这里精品视频在线6| 最新中文字幕亚洲| 亚洲伊人观看| 亚洲一二三级电影| 免费成人网www| 免费日韩成人| 黄色影院成人| 久久久久久久久久久久久久一区 | 亚洲综合大片69999| 久久国产精品毛片| 欧美一区二区三区啪啪| 美女尤物久久精品| 久久久噜噜噜久久中文字免| 国产精品毛片在线| 一区二区三区国产| 一区二区欧美精品| 欧美色欧美亚洲另类二区| 亚洲日本中文字幕免费在线不卡| 永久域名在线精品|