槽(Qt)

本詞條是多義詞,共4個義項
更多義項 ▼ 收起列表 ▲

槽在Qt的C++類中是private slots,是一種函式類型。

槽是普通的 C++ 成員函式,可以被正常調用,它們唯一的特殊性就是很多信號可以與其相關聯。當與其關聯的信號被發射時,這個槽就會被調用。槽可以有參數,但槽的參數不能有預設值。。

基本介紹

  • 中文名:槽
  • 外文名:public slots、private slots 和 protected slots。
槽,程式樣例,

槽是普通的 C++ 成員函式,可以被正常調用,它們唯一的特殊性就是很多信號可以與其相關聯。當與其關聯的信號被發射時,這個槽就會被調用。槽可以有參數,但槽的參數不能有預設值。
既然槽是普通的成員函式,因此與其它的函式一樣,它們也有存取許可權。槽的存取許可權決定了誰能夠與其相關聯。同普通的 C++ 成員函式一樣,槽函式也分為三種類型,即 public slots、private slots 和 protected slots。
  • public slots:在這個區內聲明的槽意味著任何對象都可將信號與之相連線。這對於組件編程非常有用,你可以創建彼此互不了解的對象,將它們的信號與槽進行連線以便信息能夠正確的傳遞。
  • protected slots:在這個區內聲明的槽意味著當前類及其子類可以將信號與之相連線。這適用於那些槽,它們是類實現的一部分,但是其界面接口卻面向外部。
  • private slots:在這個區內聲明的槽意味著只有類自己可以將信號與之相連線。這適用於聯繫非常緊密的類。
槽也能夠聲明為虛函式,這也是非常有用的。
槽的聲明也是在頭檔案中進行的。例如,下面聲明了三個槽:
1
2
3
4
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
槽在Qt開發軟體裡面是一個很重要的概念,在Qt裡面,與信號連線的函式就是槽,我們一般稱之為槽函式。

程式樣例

這裡給出了一個簡單的樣例程式,程式中定義了三個信號、三個槽函式,然後將信號與槽進行了關聯,每個槽函式只是簡單的彈出一個對話框視窗。讀者可以用 kdevelop 生成一個簡單的 QT 應用程式,然後將下面的代碼添加到相應的程式中去。
信號和槽函式的聲明一般位於頭檔案中,同時在類聲明的開始位置必須加上 Q_OBJECT 語句,這條語句是不可缺少的,它將告訴編譯器在編譯之前必須先套用 moc 工具進行擴展。關鍵字 signals 指出隨後開始信號的聲明,這裡 signals 用的是複數形式而非單數,siganls 沒有 public、private、protected 等屬性,這點不同於 slots。另外,signals、slots 關鍵字是 QT 自己定義的,不是 C++ 中的關鍵字。
信號的聲明類似於函式的聲明而非變數的聲明,左邊要有類型,右邊要有括弧,如果要向槽中傳遞參數的話,在括弧中指定每個形式參數的類型,當然,形式參數的個數可以多於一個。
關鍵字 slots 指出隨後開始槽的聲明,這裡 slots 用的也是複數形式。
槽的聲明與普通函式的聲明一樣,可以攜帶零或多個形式參數。既然信號的聲明類似於普通 C++ 函式的聲明,那么,信號也可採用 C++ 中虛函式的形式進行聲明,即同名但參數不同。例如,第一次定義的 void mySignal() 沒有帶參數,而第二次定義的卻帶有參數,從這裡我們可以看到 QT 的信號機制是非常靈活的。
信號與槽之間的聯繫必須事先用 connect 函式進行指定。如果要斷開二者之間的聯繫,可以使用函式 disconnect。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//tsignal.h
...
class TsignalApp:public QMainWindow
{
Q_OBJECT
...
// 信號聲明區
signals:
// 聲明信號 mySignal()
void mySignal();
// 聲明信號 mySignal(int)
void mySignal(int x);
// 聲明信號 mySignalParam(int,int)
void mySignalParam(int x,int y);
// 槽聲明區
public slots:
// 聲明槽函式 mySlot()
void mySlot();
// 聲明槽函式 mySlot(int)
void mySlot(int x);
// 聲明槽函式 mySignalParam (int,int)
void mySignalParam(int x,int y);
}
...
//tsignal.cpp
...
TsignalApp::TsignalApp()
{
...
// 將信號 mySignal() 與槽 mySlot() 相關聯
connect(this,SIGNAL(mySignal()),SLOT(mySlot()));
// 將信號 mySignal(int) 與槽 mySlot(int) 相關聯
connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int)));
// 將信號 mySignalParam(int,int) 與槽 mySlotParam(int,int) 相關聯
connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int)));
}
// 定義槽函式 mySlot()
void TsignalApp::mySlot()
{
QMessageBox::about(this,"Tsignal", "This is a signal/slot sample without
parameter.");
}
// 定義槽函式 mySlot(int)
void TsignalApp::mySlot(int x)
{
QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one
parameter.");
}
// 定義槽函式 mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
char s[256];
sprintf(s,"x:%d y:%d",x,y);
QMessageBox::about(this,"Tsignal", s);
}
void TsignalApp::slotFileNew()
{
// 發射信號 mySignal()
emit mySignal();
// 發射信號 mySignal(int)
emit mySignal(5);
// 發射信號 mySignalParam(5,100)
emit mySignalParam(5,100);
}

相關詞條

熱門詞條

聯絡我們