訊號(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的子類 實現訊號和槽的類,必須以巨集...