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

隨筆 - 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| 99精品99久久久久久宅男| 亚洲国产精品一区二区第一页 | 亚洲午夜免费视频| 亚洲一本大道在线| 欧美中文字幕在线视频| 久久精品在线| 欧美高清在线一区| 日韩午夜激情av| 亚洲欧美日韩一区二区| 久久久最新网址| 欧美人与禽猛交乱配| 国产乱码精品| 亚洲国产高潮在线观看| 亚洲女女女同性video| 久久伊人一区二区| 99精品国产在热久久下载| 久久www成人_看片免费不卡| 狼人天天伊人久久| 国产精品私拍pans大尺度在线 | 亚洲大片在线观看| 中文一区在线| 猛干欧美女孩| 国产欧美日韩精品a在线观看| 亚洲电影视频在线| 性亚洲最疯狂xxxx高清| 亚洲三级性片| 久久人人97超碰人人澡爱香蕉| 欧美日韩中文在线| 一区二区亚洲精品| 欧美一区二区免费视频| 最新中文字幕一区二区三区| 久久国产精品电影| 国产精品美女久久久久av超清| 亚洲国产精品123| 久久国产精品72免费观看| 亚洲乱亚洲高清| 免费日本视频一区| 国语自产精品视频在线看| 亚洲欧美韩国| 亚洲性视频网址| 欧美日韩精品免费观看视一区二区| 国产亚洲欧美另类中文| 午夜精品在线视频| 亚洲精品一区二区三区99| 老司机久久99久久精品播放免费| 91久久精品一区二区三区| 亚洲欧美日韩精品综合在线观看| 欧美激情欧美激情在线五月| 午夜欧美精品久久久久久久| 欧美日韩精品综合| 99在线精品视频在线观看| 欧美国产视频在线观看| 久久久久国产精品午夜一区| 国产综合婷婷| 麻豆久久精品| 久久久久久久久岛国免费| 狠狠色丁香婷婷综合| 久久欧美肥婆一二区| 欧美一区二区三区在线免费观看| 国产精品天天看| 欧美亚洲一区二区在线| 亚洲女人小视频在线观看| 国产精品久久看| 欧美在线精品一区| 久久精品一本久久99精品| 在线不卡中文字幕播放| 欧美大片国产精品| 欧美日韩精品免费观看视一区二区 | 一本大道久久a久久精二百| 亚洲国产你懂的| 欧美日韩精品欧美日韩精品| 午夜日韩激情| 久久精品一区二区三区不卡| 亚洲韩国一区二区三区| 日韩亚洲欧美高清| 国产亚洲福利一区| 牛牛精品成人免费视频| 欧美激情五月| 性伦欧美刺激片在线观看| 久久国产精品色婷婷| 亚洲人成在线观看网站高清| 在线亚洲自拍| 伊人久久av导航| 亚洲精品美女91| 国产农村妇女精品一二区| 久久免费的精品国产v∧| 欧美成人高清| 欧美一级一区| 免费日韩成人| 欧美亚洲综合另类| 麻豆精品传媒视频| 先锋影音网一区二区| 久久久高清一区二区三区| 99精品视频免费观看视频| 午夜精品久久久久久久男人的天堂 | 亚洲视频第一页| 国产在线不卡| 日韩视频永久免费| 在线免费观看日本欧美| 亚洲视频一二| 99成人精品| 久久理论片午夜琪琪电影网| 亚洲午夜精品一区二区三区他趣| 玖玖玖国产精品| 一本色道久久综合一区| 国产综合亚洲精品一区二| 亚洲欧洲在线观看| 精品动漫3d一区二区三区免费版| 亚洲美女91| 亚洲黄网站黄| 欧美中文字幕精品| 亚洲欧美福利一区二区| 欧美极品在线观看| 免费看亚洲片| 好吊色欧美一区二区三区视频| 99国产一区| 亚洲精品国产精品乱码不99| 久久精品视频播放| 欧美在线免费观看| 国产精品r级在线| 亚洲理伦在线| 99精品热视频| 欧美日韩不卡合集视频| 欧美国内亚洲| 亚洲国产精品久久91精品| 欧美在线视频一区二区三区| 久久成人18免费观看| 国产欧美日韩综合一区在线播放 | 亚洲香蕉视频| 亚洲一区二区精品在线| 欧美日韩另类综合| av成人国产| 亚洲欧美日韩一区在线观看| 欧美性感一类影片在线播放| 99精品国产在热久久下载| 亚洲一区二区3| 国产精品v欧美精品∨日韩| 中文国产亚洲喷潮| 亚洲欧美激情诱惑| 国产欧美综合在线| 欧美在线观看网站| 蜜臀av国产精品久久久久| 伊大人香蕉综合8在线视| 久久婷婷亚洲| 亚洲伦伦在线| 午夜精品久久99蜜桃的功能介绍| 国产精品青草久久| 欧美影片第一页| 欧美aa国产视频| 夜色激情一区二区| 国产精品久久久久影院色老大| 亚洲女人天堂av| 欧美丰满高潮xxxx喷水动漫| 亚洲精品护士| 国产精品美女久久久浪潮软件| 欧美一区激情| 亚洲人成毛片在线播放| 亚洲欧美日韩在线观看a三区| 国产欧美日韩不卡| 欧美77777| 亚洲午夜视频在线| 欧美韩国日本综合| 亚洲一区www| 在线国产精品播放| 国产精品www色诱视频| 欧美在线视频免费观看| 亚洲精品久久久一区二区三区| 亚洲在线一区| 亚洲第一黄网| 国产主播一区| 午夜日韩视频| 亚洲国产精品久久久久婷婷884| 欧美剧在线免费观看网站| 亚洲欧美国产一区二区三区| 免费日韩成人| 欧美一级专区| 99精品视频免费观看视频| 国产性做久久久久久| 欧美乱妇高清无乱码| 欧美一二区视频| av成人免费观看| 亚洲第一福利视频| 久久久久久网站| 亚洲永久视频| 91久久中文| 免费不卡在线观看| 亚洲免费小视频| 亚洲美女色禁图| 亚洲高清一二三区| 国内成人精品2018免费看| 国产精品h在线观看| 欧美激情中文字幕一区二区| 久久精品国产亚洲一区二区三区| 一本久久综合| 亚洲精品在线免费观看视频| 欧美激情亚洲| 亚洲成色777777女色窝|