PyQt5教程 四 事件與訊號

2021-07-16 05:54:56 字數 4282 閱讀 5329

在這部分教程中我們將**在程式內部發生的事件與訊號。

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

-事件源

-事件(物件)

-事件接收者

事件源是狀態發生變化的物件。它會生成事件。事件(物件)封裝了事件源中狀態的變動。事件接收者是要通知的物件。事件源物件將事件處理的工作交給事件接收者。

pyqt5有乙個獨特的signal&slot(訊號槽)機制來處理事件。訊號槽用於物件間的通訊。signal在某一特定事件發生時被觸發,slot可以是任何callable物件。當signal觸發時會呼叫與之相連的slot。

這是乙個演示pyqt5訊號槽的簡單示例。

import sys

from pyqt5.qtcore import qt

class

example

(qwidget):

def__init__

(self):

super().__init__()

self.initui()

definitui

(self):

lcd = qlcdnumber(self)

sld = qslider(qt.horizontal, self)

vbox = qvboxlayout()

vbox.addwidget(lcd)

vbox.addwidget(sld)

self.setlayout(vbox)

sld.valuechanged.connect(lcd.display)

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

self.setwindowtitle("signal & slott")

self.show()

if __name__ == "__main__":

ex = example()

這個例子中展示了乙個qtgui.qlcdnumber和qtgui.qslider。lcd的值會隨著滑塊的拖動而改變。

sld.valuechanged

.connect(lcd.display)

在這裡我們將滑動條的valuechanged訊號連線到lcd的display插槽。

sender是發出訊號的物件。receiver是接收訊號的物件。slot(插槽)是對訊號做出反應的方法。

在pyqt5中常通過重新實現事件處理器來處理事件。

import sys

from pyqt5.qtcore import qt

class

example

(qwidget):

def__init__

(self):

super().__init__()

self.initui()

definitui

(self):

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

self.setwindowtitle("event handler")

self.show()

defkeypressevent

(self, e):

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

self.close()

if __name__ == "__main__":

ex = example()

在示例中我們重新實現了keypressevent()事件處理器。

def

keypressevent

(self, e):

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

self.close()

我們按下escape鍵會使程式退出。

有時需要知道訊號是由哪個控制項發起的。對此pyqt5提供了sender()方法。

import sys

class

example

(qmainwindow):

def__init__

(self):

super().__init__()

self.initui()

definitui

(self):

btn1 = qpushbutton("button 1", self)

btn1.move(30, 50)

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

defbuttonclicked

(self):

sender = self.sender()

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

if __name__ == "__main__":

ex = example()

我們建立了兩個按鈕。在buttonclicked()方法中通過呼叫sender()方法來判斷當前按下的是哪個按鈕。

btn1.clicked

.connect(self.buttonclicked)

btn2.clicked

.connect(self.buttonclicked)

兩個按鈕連線到了同乙個插槽。

def

buttonclicked

(self):

sender = self.sender()

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

我們通過呼叫sender()方法來判斷訊號源, 並將其名稱顯示在窗體的狀態列中。

通過qobject建立的物件可以發出訊號。下面的示例演示了如何發出自定義訊號。

我們在這部分教程中介紹了pyqt5的訊號槽機制。

pyqt5學習(四)事件和訊號

顧名思義 事件就是執行的東西,訊號就和觸發類似吧,是一種動作 qlcdnumber類 類似於qlable是一種顯示標籤,一般好像多用於顯示時間 qslider類 滑動條類 qtcore 包含了核心的非gui的功能。主要和時間 檔案與資料夾 各種資料 流 urls mime類檔案 程序與執行緒一起使用...

pyqt5 訊號與槽

描述self.obj.destroyed.connect destroy cao 觸發後會執行槽函式,並給槽函式返回釋放物件 self.obj.blocksignals true 臨時打斷訊號 self.obj.objectnamechanged.disconnect 斷開訊號與槽的連線 self....

pyqt5 訊號與槽

訊號與槽 是pyqt的精髓,要多總結學習一下 定義通俗解釋 事件源 狀態發生改變的物件,它產生事件 source obj 按鈕 物件 事件目標 是想要被通知的物件 target obj 被點選 狀態發生改變 事件物件 封裝了事件源中的狀態變化 evnet obj 執行 呼叫函式 def use se...