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

隨筆 - 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>
            一色屋精品视频在线看| 精品不卡视频| 欧美色123| **性色生活片久久毛片| 久久久精品国产一区二区三区| 欧美69wwwcom| 久久国产乱子精品免费女| 国产精品xnxxcom| 一区二区三区久久| 欧美激情一区二区三区不卡| 久久久久在线观看| 一区二区在线视频播放| 久久久久一区二区| 久久精品国产精品亚洲| 国产一区视频网站| 久久久久91| 欧美资源在线观看| 激情综合色综合久久| 久久综合图片| 老司机免费视频久久| 在线免费观看欧美| 欧美成人免费全部观看天天性色| 欧美一级夜夜爽| 国产亚洲精品久久久久动| 先锋资源久久| 欧美一级片在线播放| 精品不卡一区二区三区| 欧美freesex交免费视频| 开心色5月久久精品| 亚洲国产精品va在线看黑人动漫| 亚洲欧美日韩精品在线| 日韩一级成人av| 欧美日韩一区二区三| 亚洲视频网站在线观看| 亚洲婷婷在线| 国产专区综合网| 女生裸体视频一区二区三区| 美女日韩在线中文字幕| 一区二区三区精品国产| 先锋影音久久| 亚洲国产欧美一区| 亚洲毛片播放| 国产欧美日韩中文字幕在线| 久久亚洲风情| 欧美另类女人| 欧美在线免费视频| 久久综合九色| 亚洲一区中文字幕在线观看| 午夜免费久久久久| 亚洲日本理论电影| 亚洲一区二区成人| 黄色一区二区三区四区| 亚洲精选91| 国产真实乱偷精品视频免| 亚洲国产精品悠悠久久琪琪| 欧美精品在线观看播放| 欧美一区二区网站| 欧美护士18xxxxhd| 久久久国产精品一区| 欧美精品成人一区二区在线观看| 午夜日韩在线观看| 欧美不卡一卡二卡免费版| 午夜日本精品| 欧美成人自拍视频| 久久久www免费人成黑人精品| 欧美成人精品h版在线观看| 久久不射中文字幕| 欧美日韩精品高清| 欧美激情1区2区3区| 国产日本欧美在线观看| 日韩视频免费观看高清在线视频| 狠狠色狠狠色综合日日小说| 亚洲视频中文字幕| 一区二区日韩欧美| 久久最新视频| 久久久久久电影| 国产精品欧美一区喷水| 亚洲欧洲精品一区二区三区| 狠狠入ady亚洲精品| 亚洲私人黄色宅男| 一本色道久久综合狠狠躁篇的优点 | 亚洲福利小视频| 国产日韩欧美成人| 一本色道久久综合亚洲精品高清| 亚洲国产美国国产综合一区二区| 午夜在线a亚洲v天堂网2018| 亚洲一区www| 欧美精品大片| 亚洲激情午夜| 亚洲精品欧美日韩专区| 久久久一区二区| 在线日韩电影| 亚洲黄色影院| 国产欧美日韩免费看aⅴ视频| 久久久久国色av免费看影院| 国产精品自拍小视频| 亚洲已满18点击进入久久| 亚洲砖区区免费| 国产精品久久91| 亚洲午夜一区| 欧美一级播放| 国产区二精品视| 欧美一区日本一区韩国一区| 久久精彩视频| 尤物在线观看一区| 欧美a级理论片| 日韩一区二区精品| 亚洲影音一区| 国产欧美欧美| 久久久水蜜桃av免费网站| 欧美不卡三区| 99精品国产99久久久久久福利| 欧美激情中文字幕一区二区| 亚洲精品之草原avav久久| 亚洲欧美日韩电影| 韩国自拍一区| 欧美大片在线影院| 亚洲精品视频一区| 亚洲欧美视频在线观看| 国产一区二区三区黄| 久久久最新网址| 亚洲精品中文在线| 欧美亚洲一级片| 在线日本成人| 欧美日韩亚洲精品内裤| 亚洲欧美国产一区二区三区| 久久欧美中文字幕| 国产三级精品在线不卡| 亚洲天堂黄色| 免费日本视频一区| 一本色道久久综合亚洲精品高清 | 亚洲国产va精品久久久不卡综合| 日韩一二三区视频| 国产美女精品免费电影| 久久一区二区三区国产精品| 亚洲精品国产日韩| 欧美在线播放视频| 亚洲人在线视频| 国产美女精品视频免费观看| 久久久综合免费视频| 99亚洲一区二区| 玖玖玖国产精品| 亚洲一区二区免费看| 在线播放国产一区中文字幕剧情欧美| 欧美日本视频在线| 久久gogo国模裸体人体| 亚洲美女av在线播放| 久久午夜av| 亚洲欧美一区在线| 亚洲美女在线观看| 国产一区二区三区在线观看免费视频 | 欧美成人午夜激情视频| 亚洲一区二区三区精品在线观看| 今天的高清视频免费播放成人| 欧美黑人国产人伦爽爽爽| 久久成年人视频| 日韩视频一区二区三区在线播放| 久久久久免费观看| 国产乱子伦一区二区三区国色天香 | 亚洲一区久久| 欧美视频1区| 久久激情婷婷| 你懂的亚洲视频| 一本色道久久综合亚洲精品婷婷 | 久久国产精品99国产精| 91久久国产自产拍夜夜嗨| 午夜精品福利一区二区三区av| 欧美视频网址| 欧美顶级大胆免费视频| 久久久久久穴| 欧美一区二区在线免费播放| 99热精品在线| 亚洲伦理自拍| 亚洲精品专区| 亚洲精品欧美一区二区三区| 美女福利精品视频| 久久这里只有| 久久久精品999| 久久精品最新地址| 久久国产精品第一页| 久久久久久久久久久一区| 久久精品国内一区二区三区| 欧美伊人久久久久久久久影院| 亚洲欧美偷拍卡通变态| 欧美一区二区视频观看视频| 久久国产精品色婷婷| 久久精品免费| 巨乳诱惑日韩免费av| 毛片av中文字幕一区二区| 蘑菇福利视频一区播放| 欧美激情中文不卡| 日韩午夜在线| 午夜精品视频在线| 久久久久久久97| 欧美护士18xxxxhd| 国产精品―色哟哟| 国产色产综合产在线视频| 国产亚洲一二三区| 亚洲国产影院| 亚洲调教视频在线观看|