Qt 訊號與槽

2021-10-21 12:14:04 字數 3454 閱讀 6066

訊號(signal)就是在特定情況下被發射的事件

(slot)就是對訊號響應的函式。槽就是乙個函式

connect()是 qobject 類的乙個靜態函式,而 qobject 是所有 qt 類的基類,在實際呼叫時可以忽略前面的限定符,所以可以直接寫為:

connect

(sender,

signal

(signal()

), receiver,

slot

(slot()

));

其中,sender 是發射訊號的物件的名稱,signal() 是訊號名稱。訊號可以看做是特殊的函式,需要帶括號,有引數時還需要指明引數。receiver 是接收訊號的物件名稱,slot() 是槽函式的名稱,需要帶括號,有引數時還需要指明引數。

自定義訊號

訊號沒有返回值, 但可以有引數

訊號只有函式宣告, 無需定義

使用emit 傳送訊號

注意:

槽可以是任何成員函式、普通全域性函式、靜態函式

槽函式和訊號的引數和返回值要一致

由於訊號是沒有返回值的, 槽函式也一定沒有返回值

例項1:

connect

(&pbt1,

&qpushbutton::pressed,

this

,&mainwindow::close)

;

第乙個引數:傳送訊號方,型別為指標

第二個引數:傳送的訊號,型別為指標,&傳送者類名::訊號名

第三個引數:訊號接受方,型別為指標

第四個引數:槽函式,型別為指標,&接受者類名::槽函式名

注意:不同的控制項有哪些訊號,可通過幫助文件檢視,以qpushbutton為例進行說明(點qpushbutton,再按f1

例項2:

#ifndef widget_h

#define widget_h

#include

#include

#include

"subwindown.h"

class

widget

:public qwidget

;#endif

// widget_h

#ifndef subwindown_h

#define subwindown_h

#include

#include

class

subwindown

:public qwidget

;#endif

// subwindown_h

#include

"widget.h"

#include

intmain

(int argc,

char

*ar**)

#include

"widget.h"

widget::

widget

(qwidget *parent)

:qwidget

(parent)

void widget::

my_slot()

void widget::

dealsub()

widget::

~widget()

#include

"subwindown.h"

subwindown::

subwindown

(qwidget *parent)

:qwidget

(parent)

void subwindown::

sendslot()

注意:訊號必須有signals關鍵字宣告,也就是說在標頭檔案的類中新增乙個關鍵字signals:就像一般的public:一樣。而槽函式可以什麼都不加,也可以private slots:

connect函式還有一種寫法:

connect

(m_pbtn,

signal

(sigclicked()

),this

,slot

(onclicked()

));

除此之外見:

總結:

connect函式,首先四個引數都是指標型別。

對於使用ui設計器的: connect(ui->pushbutton,qpushbutton::pressed,this,mainwindow::close);

對於使用自定義控制項: connect(&pbt,qpushbutton::pressed,this,mainwindow::close);

兩個區別就在第乙個引數,第乙個加上&不可,第二個不加&不可。

倘若想使用signal與slot

對於第一種:connect(ui->pushbutton,signal(pressed()),this,slot(close()));

對於第二種:connect(&pbt,signal(pressed()),this,slot(close()));

第1,3個引數一樣,區別在使用signal和slot,加上之後不必再要類名,而且要加括號,因為這兩個關鍵字會預設轉成指標型別。

上面connect函式的第五個引數

對於訊號,一般控制項都會自帶,所以直接用就可以了,如果非要自定義訊號,要在類中加關鍵字signals:,同時如要傳送訊號則要關鍵字emit

對於槽函式,雖說不侷限於成員函式(而且控制項自帶的函式也可作為槽函式),但為了方便理解**,還是建議放在類中,private slots:

訊號和槽函式都不侷限於同一檔案下,可以跨檔案(跨類),注意加上標頭檔案,傳送訊號和接受訊號的物件記得定義即可!

訊號的引數作用:訊號函式本身不需要定義,那麼其引數有何意義?其實,是為了傳參給槽函式。

qt 槽與訊號

槽就是乙個可以被呼叫處理特定訊號的函式 乙個小的qt類如下 class foo public qobject public slots void setvalue int signals void valuechanged int private int val qt中的元物件系統是用來處理物件間通...

QT訊號與槽

初學qt,覺得理解qt訊號與槽比較重要,qt很多時候都需要用到訊號和槽。發射訊號會觸發相對應的槽函式的執行。乙個訊號可以對應多個槽,多個訊號可以對應乙個槽。訊號和槽是通過connect這個方法進行建立聯絡的。qt中有些類會自帶有一些訊號和槽函式,當然訊號和槽函式也可以自己定義。下面來看下很簡單的 會...

Qt訊號與槽

訊號的定義必須在signals 保留字下,並且不需要實現 槽的定義必須在slots 保留字下,需要實現 訊號和槽通過qobject connect函式連線 當訊號被觸發時,槽函式被呼叫 需要注意的是 訊號和槽是qt的拓展,所以實現訊號和槽的類,必須是qobject的子類 實現訊號和槽的類,必須以巨集...