1. 程式人生 > >PyQt4入門學習筆記(四)

PyQt4入門學習筆記(四)

在PyQt4中的事件和訊號

事件

所有的GUI應用都是事件驅動的。事件主要是來自於應用的使用者,但是像網際網路連線,視窗管理器或者計時器也可以產生事件。當我們呼叫應用的exec_()方法時,應用就進入了主迴圈。主迴圈將抓取事件並且將其傳送到對應的物件中去。

在事件模型中,有三個參與者:

  1. 事件源
  2. 事件物件
  3. 事件目標

事件源是改變狀態的物件。它生成事件。事件物件囊括了在事件源中狀態的改變情況。事件目標是將要通知的物件,事件源通過事件來操控事件物件。

PyQ4有獨一無二的訊號和槽機制去處理事件。訊號和槽被用於在兩個物件間進行交流的。。當特定的事件發生時,訊號被髮出。一個槽可以被任何物件呼叫。當訊號發出並連線到槽時,槽被呼叫。

新的API

PyQt4.5有一種新式的API用來處理訊號和槽。

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

這是舊式的API

下面是新式的API

button.clicked.connect(self.onClicked)

訊號和槽

下面是一個使用訊號和槽的簡單示範例子

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

執行後如下圖
image1

在這個例子中,我們展示了QtGui.QLCDNumberQtGui.QSlider,我們通過滑動小塊來改變lcd的值

sld.valueChanged.connect(lcd.display)

在這裡我們連線了一個滑塊的valueChanged訊號到lcddisplay槽。

"sender"是一個傳送訊號的物件。"receiver"是接受訊號的物件。"slot"是對訊號起反應的方法。

事件過載管理者(Reimplementing event handler)

在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()

當我們按下“ESC”時,我們的應用會被關閉。

事件傳送器

有些時候我們需要知道是哪個控制元件傳送了訊號。基於此,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()方法裡我們通過呼叫senter()方法來確定是哪個按鈕被按下了。

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

兩個按鈕被連線到了相同的槽

def buttonClicked(self):
  
    sender = self.sender()
    self.statusBar().showMessage(sender.text() + ' was pressed')

我們通過呼叫senter()方法確定了訊號源。在這個應用的狀態列,我們顯示了是哪個按鈕被按下。

如圖

image2

產生訊號

通過QtCore.QObject建立的物件可以產生訊號。在下面的例子裡我們將看到如何產生特定的訊號

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
ZetCode PyQt4 tutorial 

In this example, we show how to emit a
signal. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

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()    

當我們點選視窗時,closeApp訊號被觸發,應用關閉。

在這部分,我們講了訊號和槽。

相關推薦

PyQt4入門學習筆記

在PyQt4中的事件和訊號 事件 所有的GUI應用都是事件驅動的。事件主要是來自於應用的使用者,但是像網際網路連線,視窗管理器或者計時器也可以產生事件。當我們呼叫應用的exec_()方法時,應用就進入了主迴圈。主迴圈將抓取事件並且將其傳送到對應的物件中去。 在事件模型中,有三個參與者: 事件源 事件物件

python入門學習筆記——if語句

5. if語句 5.1  簡單if語句 sum = 20; if sum < 19:     print('OK')        5.2  if-else

PyQt4入門學習筆記

PyQt4裡的對話方塊 對話方塊是大多數GUI應用中不可分割的一部分。一個對話方塊是兩者或多者的會話。在GUI內,對話方塊是應用向人說話的方式。一個對話方塊可以用來輸入資料,修改資料,改變應用設定等等。 QtGui.QInputDialog QtGui.QInputDialog給使用者提供了一個簡單方便的

Opencv3程式設計入門學習筆記之split通道分離Debug過程中0xC0000005記憶體訪問衝突問題

這是筆者學習《Opencv3程式設計入門》的第四篇部落格,這篇部落格主要是解決在Windows系統下VS 2013中Debug含有split分離通道色彩函式時報出的0xC0000005記憶體訪問衝突問題,問題表現如下面第一幅圖所示。 剛剛遇到這個問題的時候

TensorFlow學習筆記—— 入門 —— 基本使用

基本使用 使用 TensorFlow, 你必須明白 TensorFlow: 使用圖 (graph) 來表示計算任務. 在被稱之為 會話 (Session) 的上下文 (context) 中執行圖. 使用 tensor 表示資料. 通過 變數 (Variable) 維

Cocos2d-x學習筆記 布景層的加入移除

dcl from position 顏色 顯示地圖 idt col 分享 學習 布景層類也就是CCLayer類,每一個遊戲場景中都能夠有非常多層,每一層負責各自的任務。顯示地圖、顯示人物等。同一時候層還是一個容器,能夠放入文本、圖片和菜單。構成遊戲中一個個UI。這次

機器學習筆記機器學習可行性分析

資料 表示 image 隨機 訓練樣本 -s mage 例如 lin 從大量數據中抽取出一些樣本,例如,從大量彈珠中隨機抽取出一些樣本,總的樣本中橘色彈珠的比例為,抽取出的樣本中橘色彈珠的比例為,這兩個比例的值相差很大的幾率很小,數學公式表示為: 用抽取到的樣本作為訓練

Python_sklearn機器學習學習筆記decision_tree決策樹

min n) 空間 strong output epo from 標簽 ict # 決策樹 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.

Python學習筆記 列表生成式_生成器

rec triangle 小寫 ont 無限 end clas 普通 執行過程 筆記摘抄來自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431

前端開發入門學習筆記

type red 學習 lin attach black 復合 等於 round HTML:超文本標記語言。 html:是一個基礎結構。 CSS:就是跟網頁做裝修的,修飾HTML的基礎內容:樣式。 JavaScript:一個網頁的行為,動作,動態的東西。 html標準文件格

Unity3D之Mecanim動畫系統學習筆記:Animation State

大致 面板 輸入 jpg any 動畫播放 速度 nsf 顯示 動畫的設置 我們先看看Animation Clip的一些設置: Loop time:動畫是否循環播放。 下面出現了3個大致一樣的選項: Root Transform Rotation:表示為播放動畫

.net core 2.0學習筆記:遷移.net framework 工程到.net core

編譯 its evel hashtable ref 學習筆記 inline null 創建 在遷移.net core的過程中,第一步就是要把.net framework 工程的目標框架改為.net core2.0,但是官網卻沒有提供轉換工具,需要我們自己動手完成了

ES6學習筆記—— async 函數

ons fst cte code span pre getname 普通 聲明 await 是 async wait 的簡寫, 是 generator 函數的語法糖。 async 函數的特點: async 聲明一個方法是異步的,await 則等待這個異步方法執行的完

Hibernate學習筆記 --- 映射基本數據類型的List集合

varchar prim drop n) 進行 lis auth pos 方案 集合按其內元素的數據類型分為兩種:基本數據類型集合及復雜對象類型集合,Hibernate對於兩類集合提供不同的映射方式。(在類上以@Embeddable註解的復雜對象數據類型處理方式同基本數據類

java學習筆記:import語法

employee sign cnblogs java 調用 變量賦值 temp 職位 求職 Import 語法是給編譯器尋找特定類的適當位置的一種方法。 創建一個Employee 類,包括四個實體變量姓名(name),年齡(age),職位(designation)和薪水(s

Cesium學習筆記Camera

ttr can str efault 簡單的 list 事件處理 get provider http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相機控制場景中的視野。操作相機的方法有很多,如

python學習筆記-數據類型

rand 兩個 urn 浪費 line 平年 randint .com .cn 0. 在 Python 中的數據類型詳解 http://www.cnblogs.com/scios/p/8026576.html 1. 為什麽布爾類型(bool)的 True 和 False 分

Nodejs學習筆記-----Buffer

pretty 成員 保存 n) tin 設置 amp 個數 普通 Node.js Buffer(緩沖區) JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。 但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buf

Elasticsearch學習筆記ElasticSearch分布式機制

clas cse 負載均衡 丟失 數據 不可 分布式 復雜 發生 一、Elasticsearch對復雜分布式機制透明的隱藏特性 1、分片機制: (1)index包含多個shard,每個shard都是一個最小工作單元,承載部分數據,lucen

DeepLearning.ai學習筆記卷積神經網絡 -- week1 卷積神經網絡基礎知識介紹

除了 lock 還需要 情況 好處 計算公式 max 位置 網絡基礎 一、計算機視覺 如圖示,之前課程中介紹的都是64* 64 3的圖像,而一旦圖像質量增加,例如變成1000 1000 * 3的時候那麽此時的神經網絡的計算量會巨大,顯然這不現實。所以需要引入其他的方法來