-
槽
(Qt)
鎖定
- 中文名
- 槽
- 外文名
- 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); |
槽程序樣例
這裏給出了一個簡單的樣例程序,程序中定義了三個信號、三個槽函數,然後將信號與槽進行了關聯,每個槽函數只是簡單的彈出一個對話框窗口。讀者可以用 kdevelop 生成一個簡單的 QT 應用程序,然後將下面的代碼添加到相應的程序中去。
信號和槽函數的聲明一般位於頭文件中,同時在類聲明的開始位置必須加上 Q_OBJECT 語句,這條語句是不可缺少的,它將告訴編譯器在編譯之前必須先應用 moc 工具進行擴展。關鍵字 signals 指出隨後開始信號的聲明,這裏 signals 用的是複數形式而非單數,siganls 沒有 public、private、protected 等屬性,這點不同於 slots。另外,signals、slots 關鍵字是 QT 自己定義的,不是 C++ 中的關鍵字。
信號的聲明類似於函數的聲明而非變量的聲明,左邊要有類型,右邊要有括號,如果要向槽中傳遞參數的話,在括號中指定每個形式參數的類型,當然,形式參數的個數可以多於一個。
關鍵字 slots 指出隨後開始槽的聲明,這裏 slots 用的也是複數形式。
槽的聲明與普通函數的聲明一樣,可以攜帶零或多個形式參數。既然信號的聲明類似於普通 C++ 函數的聲明,那麼,信號也可採用 C++ 中虛函數的形式進行聲明,即同名但參數不同。例如,第一次定義的 void mySignal() 沒有帶參數,而第二次定義的卻帶有參數,從這裏我們可以看到 QT 的信號機制是非常靈活的。
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); } |
- 參考資料
-
- 1. QT 的信號與槽機制介紹 .IBM[引用日期2018-12-20]
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:7次歷史版本
- 最近更新: 是玖小念