複製鏈接
請複製以下鏈接發送給好友

(Qt)

鎖定
槽在Qt的C++類中是private slots,是一種函數類型。 [1] 
中文名
外文名
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裏面,與信號連接的函數就是槽,我們一般稱之為槽函數。 [1] 

程序樣例

這裏給出了一個簡單的樣例程序,程序中定義了三個信號、三個槽函數,然後將信號與槽進行了關聯,每個槽函數只是簡單的彈出一個對話框窗口。讀者可以用 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] 
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);
}
參考資料