PyQt4 學習筆記4之事件與訊號

2021-07-06 07:51:58 字數 4268 閱讀 1266

所有的gui應用程式都是基於事件驅動的。事件主要由應用程式的使用者產生,但也可以由其他方式生成:比如,網路連線,視窗管理器或者定時器。當呼叫應用程式的exec_()方法時,應用程式就進入主迴圈,主迴圈獲取事件並將其傳送給相應的物件。

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

事件源來自於狀態發生改變的物件,它們產生事件。事件物件(事件)封裝了狀態變化的事件源。事件目標是需要被通知的物件。

pyqt4採用獨特的訊號槽(signal & slot)機制處理事件。訊號槽用於兩個物件之間通訊。當特定事件發生時,乙個訊號(signal)將被觸發。槽(slot)可以是任何可呼叫的python。當訊號發出時,與之關聯的槽就被呼叫。

pyqt4.5為訊號槽(signal & slot)引入了新風格的api。

qtcore.qobject.connect(button, qtcore.signal('clicked()'), self.onclicked)
原有風格的api如下所示:

button.clicked

.connect(self.onclicked)

下面的**是關於pyqt4中訊號槽的簡單示例。

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

from pyqt4 import qtgui, qtcore

class

example

(qtgui.qwidget):

def__init__

(self):

super(example, self).__init__()

self.initui()

definitui

(self):

lcd = qtgui.qlcdnumber(self)

sld = qtgui.qslider(qtcore.qt.horizontal, self)

vbox = qtgui.qvboxlayout()

vbox.addwidget(lcd)

vbox.addwidget(sld)

self.setlayout(vbox)

# 事件新增,將滑塊按鈕的valuechanged訊號與lcd的display槽進行關聯

sld.valuechanged.connect(lcd.display)

self.setgeometry(300, 300, 250, 150)

self.setwindowtitle('signals & slots')

self.show()

defmain

(): ex = example()

if __name__ == '__main__':

main()

在上面的例子中,我們建立了乙個qtgui.qlcdnumber和qtgui.qslider物件,並通過拖動滑塊按鈕改變lcd的值。

傳送者是傳送訊號的物件,接收者是接收訊號的物件,槽(slot)是響應訊號的方法。

pyqt4中的事件進行需要通過重新實現事件處理程式來對事件進行處理。

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

from pyqt4 import qtgui, qtcore

class

example

(qtgui.qwidget):

def__init__

(self):

super(example, self).__init__()

self.initui()

definitui

(self):

self.setgeometry(300, 300, 250, 150)

self.setwindowtitle('event handler')

self.show()

# 重新實現事件處理程式,但按下'esc'鍵時,退出程式。

defkeypressevent

(self, e):

if e.key() == qtcore.qt.key_escape:

self.close()

defmain

(): ex = example()

if __name__ == '__main__':

main()

在上述示例中,我們重新實現了keypressevent()事件處理程式。當按下esc鍵時,應用程式將會退出。

有時知道那個部件傳送了訊號對我們是有幫助的。為此,pyqt4提供了sender()方法。

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

from pyqt4 import qtgui, qtcore

class

example

(qtgui.qmainwindow):

def__init__

(self):

super(example, self).__init__()

self.initui()

definitui

(self):

btn1 = qtgui.qpushbutton('button1', self)

btn1.move(30, 50)

btn2 = qtgui.qpushbutton('button2', self)

btn2.move(150, 50)

# 將兩個按鈕關聯到相同的槽(slot)。

btn1.clicked.connect(self.buttonclicked)

btn2.clicked.connect(self.buttonclicked)

self.statusbar()

self.setgeometry(300, 300, 290, 150)

self.setwindowtitle('event handler')

self.show()

# 通過呼叫sender()方法判斷訊號源。

defbuttonclicked

(self):

sender = self.sender()

self.statusbar().showmessage(sender.text() + ' was pressed')

defmain

(): ex = example()

if __name__ == '__main__':

main()

在上面的示例程式中,我們建立了兩個按鈕。在buttonclicked()方法中,我們通過呼叫sender()方法來判斷哪個按鈕被按下。

我們通過呼叫sender()方法來判斷訊號源,並在應用程式的狀態列上顯示哪個按鈕被按下。

派生自qtcore.qobject的物件可以傳送訊號。在下面的示例程式中,我們可以看到如何傳送自定義訊號。

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

from pyqt4 import qtgui, qtcore

class

communicate

(qtcore.qobject):

# 通過qtcore.pyqtsignal建立外部類communicate

# 的乙個屬性,從而建立乙個訊號。

class

example

(qtgui.qmainwindow):

def__init__

(self):

super(example, self).__init__()

self.initui()

definitui

(self):

self.c = communicate()

# 將自定義訊號與qtgui.qmainwindow的close()方法關聯。

self.setgeometry(300, 300, 290, 150)

self.setwindowtitle('event handler')

self.show()

defmousepressevent

(self, event):

defmain

(): ex = example()

if __name__ == '__main__':

main()

pyqt4學習筆記

訊號與槽機制作為qt最重要的特性,提供了任意兩個qt物件之間的通訊機制。其中,訊號會在某個特定情況或動作下被觸發,槽是用於接收並處理訊號的函式。例如,要將乙個視窗中的變化情況通知給另乙個視窗,則乙個視窗傳送訊號,另乙個視窗的槽接收此訊號並進行相應的操作,即可實現兩個視窗之間的通訊。這比傳統的圖形化程...

詳解Pyqt4事件和訊號

這是自己在 學習 pyqt 的過程中總結出來的筆記。呼叫應用的 exec 方法之後,應用進入主迴圈。主迴圈獲取事件並把它們發往物件。應用在它的生命週期中產生的不同事件互動。事件主要由使用者產生,但是它們也可以由其他方式產生,如 網際網路,視窗管理器,定時器,當乙個特殊的事件發生時,將發射訊號,槽 可...

PyQt4學習資料彙總

乙個月前研究了下pyqt4,感覺比較不錯。相比wxpython,介面美觀了很多,並且將介面設計與 邏輯很好的分離了開來。關於pyqt4的資料也不少,這裡我將我找到的資料彙總一下,以防自己以後忘得一乾二淨。1.pyqt4資料鏈結 2.寫 時,最好的幫助文件 static docs pyqt4 html...