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

隨筆 - 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国产精品一区| 美女网站久久| 中文一区在线| 亚洲毛片视频| 欧美成人一二三| 久久久www成人免费精品| 亚洲人成网在线播放| 亚洲福利一区| 黄色一区三区| 亚洲国产精品成人| 亚洲精品一区二| 欧美日韩视频在线一区二区 | 亚洲欧美一区二区三区极速播放 | 在线视频欧美日韩| 国产伦精品一区二区三区| 国产欧美日韩视频一区二区| 欧美视频一区在线| 国产一区二区三区在线观看免费| 激情伊人五月天久久综合| 亚洲国产综合在线| 国产亚洲欧美日韩在线一区| 欧美福利在线| 亚洲天堂激情| 性欧美暴力猛交69hd| 久久福利资源站| 国产精品美女午夜av| 亚洲丁香婷深爱综合| 性欧美超级视频| 一区二区三区久久网| 毛片一区二区三区| 伊人成人在线| 欧美电影电视剧在线观看| 亚洲制服丝袜在线| 亚洲高清在线| 亚洲精品乱码久久久久| 欧美精品色网| 亚洲美女黄网| 日韩一二在线观看| 欧美日韩国产黄| 午夜亚洲影视| 久久精品人人做人人爽电影蜜月| 国产精品私拍pans大尺度在线| 亚洲视频视频在线| 亚洲一区黄色| 国内精品伊人久久久久av一坑| 久久精品色图| 免费欧美在线视频| 亚洲欧美在线另类| 久久久www成人免费无遮挡大片| 亚洲精品一区二区三区不| 欧美福利小视频| 欧美一区二区三区的| 亚洲日本中文字幕| 性色av一区二区三区| 亚洲黄色av| 亚洲男人的天堂在线| 亚洲黄色尤物视频| 久久国产色av| 性视频1819p久久| 欧美电影资源| 日韩特黄影片| 亚洲欧美日本伦理| 亚洲一区二区综合| 久久精品国产一区二区三区| 国产有码在线一区二区视频| 麻豆精品视频在线观看| 日韩网站在线看片你懂的| 欧美视频1区| 亚洲国产另类久久精品| 国产精品日韩欧美| 欧美 日韩 国产精品免费观看| 欧美乱大交xxxxx| 久久超碰97人人做人人爱| 欧美专区日韩视频| 欧美一区二区视频在线观看2020| 久久久久免费| 久久精品道一区二区三区| 国产精品久久久久久超碰| 日韩一区二区精品葵司在线| 亚洲国产三级在线| 欧美精品久久久久久久久老牛影院 | 在线视频精品一区| 男女视频一区二区| 亚洲激情一区| 久久不射中文字幕| 亚洲黄色片网站| 国产一区二区三区久久久久久久久| 亚洲综合导航| 亚洲毛片网站| 欧美成人免费视频| 久久国产99| 在线视频日本亚洲性| 国产日韩欧美一区| 欧美激情亚洲自拍| 久久不见久久见免费视频1| 91久久嫩草影院一区二区| 久久亚洲电影| 久久久欧美精品sm网站| 久久精品卡一| 欧美国产一区视频在线观看| 亚洲高清激情| 国产精品乱人伦中文| 日韩亚洲欧美精品| 亚洲国产精品99久久久久久久久| 欧美激情在线免费观看| 国模套图日韩精品一区二区| 亚洲午夜在线| 亚洲欧洲免费视频| 国产丝袜一区二区| 一区一区视频| 亚洲图片欧洲图片日韩av| 欧美伊人精品成人久久综合97 | 国产网站欧美日韩免费精品在线观看| 国产精品毛片大码女人| 韩国三级电影久久久久久| 久久裸体视频| 亚洲精品一二三| 欧美一区二区三区视频在线| 国产精品尤物福利片在线观看| 亚洲国产成人不卡| 欧美成年人视频网站| 在线视频亚洲欧美| 国产精品啊啊啊| 欧美亚洲视频一区二区| 久久国产精品久久久久久| 国内精品福利| 久久一区国产| 亚洲高清视频在线观看| 一区二区三区四区蜜桃| 国产精品一级| 久久只精品国产| 欧美激情二区三区| 另类激情亚洲| 欧美精品www| 国产欧美日韩精品专区| 亚洲精品久久久一区二区三区| 亚洲激情欧美| 亚洲精品欧美在线| 亚洲黄色大片| 亚洲视频综合| 免费成人性网站| 欧美激情第五页| 欧美激情片在线观看| 欧美一区二区高清在线观看| 亚洲男女自偷自拍| 亚洲韩国日本中文字幕| 国产日本欧美视频| 牛人盗摄一区二区三区视频| 亚洲精品美女在线| 亚洲欧美综合国产精品一区| 久久久久久久综合狠狠综合| 国产精品theporn| 日韩一级片网址| 免费观看在线综合| 麻豆91精品| 欧美xx69| 玖玖精品视频| 久久精品欧美| 欧美日韩性生活视频| 欧美一区二区女人| 欧美日韩国产一区| 国产一区视频观看| 一区二区三区日韩欧美| 激情综合电影网| 亚洲性图久久| 最新成人在线| 噜噜噜在线观看免费视频日韩| 午夜国产精品影院在线观看| 免费成人av| 亚洲福利免费| 亚洲国产精品一区| 亚洲国产精品一区二区www在线| 欧美高清视频一区| 欧美性大战xxxxx久久久| 欧美日本精品| 另类天堂视频在线观看| 在线综合视频| 久久天天躁狠狠躁夜夜av| 欧美国产激情二区三区| 欧美日韩国产不卡| 国产亚洲aⅴaaaaaa毛片| 国产欧美一区二区在线观看| 激情欧美一区二区三区| 亚洲一线二线三线久久久| 欧美成人综合| 亚洲一二三四久久| 欧美日韩色一区| 亚洲成人影音| 欧美国产亚洲视频| 欧美大片在线观看一区| 国产精品一区二区欧美| 久久精品视频播放| 欧美丝袜第一区| 欧美成年网站| 国产精品一区二区三区久久久| 亚洲精品1区2区| 国产视频精品免费播放| 欧美一区二区三区四区在线观看地址| 亚洲欧洲三级电影|