1. 程式人生 > >QT 自定義函式 自定義訊號和槽

QT 自定義函式 自定義訊號和槽

在QT中自定義函式,訊號,槽基本上都是在基類上派生時設計的

這裡分兩種情況討論

一,程式碼模式

通過.H和.cpp設計介面佈局,並通過派生設計自定義的函式,訊號,槽

二,視覺化設計模式

1,設計工具設計介面

2,新建類繼承上面的介面,並設計自定義函式和訊號 槽

------------------------------------------------------------------------------------------------------------------------

一,程式碼模式

通過.H和.cpp設計介面佈局,並通過派生設計自定義的函式,訊號,槽

使用自定義的訊號和槽,需要注意以下幾點: 
1、類的宣告和實現分別放在.h和.cpp檔案中; 
2、類宣告中包含Q_OBJECT巨集; 
3、訊號只要宣告不要設計其的實現函式; 
4、發射訊號用emit關鍵字; 
5、自定義槽的實現與普通成員函式的實現一樣。 

建立使用者自定義的訊號與槽的具體步驟: 
首先你需要在類宣告中宣告自定義的訊號和槽。在關鍵字public slots:下宣告自定義槽;在signals:關鍵字下宣告自定義的訊號。如下例所示: 
class MyMainWindow : public QWidget   //在這裡繼承,派生

Q_OBJECT 
public: 
void MyMainWindow();  

 //自定義函式
void SetValue(int); 
signals:    
void ValueChanged(int);     //自定義訊號
public slots: 
void ChangeValue(int);        //自定義槽
}; 
正如你可能猜想到的,只有當一個新的值傳遞給SetValue()函式時,SetValue()函式才應該呼叫ValueChanged()訊號。之後,通過將ValueChanged()訊號連線到ChangeValue()槽,使得當有新值傳遞給SetValue()函式時,能夠引起數值的變化。多數情況下,這是不必要的,但它演示了訊號的使用方法。SetValue()函式可以像下面格式實現: 

void MyMainWindow::SetValue(int value) 

if(value!=oldvalue) 

oldvalue=value; 
emit ValueChanged(value); 


如你看到的只有,當新值與舊值不同時才發射ValueChanged()訊號,且oldvalue將被修改為value。應注意的是,訊號與槽一類的普通函式不同,它只能使用emit關鍵字發射。ChangeValue()可定義為: 
void MyMainWindow::ChangeValue(int value) 

FunctionForChangingTheValue(value); 

在這段程式碼中,呼叫 FunctionForChangingTheValue( )函式去修改資料。你需要做的最後一件事是將訊號和槽連線起來: 
connect(this,SIGNAL(ValueChanged(int)),this,SLOT(ChangeValue(int))); 
這個例子的功能是當呼叫SetValue()函式時,檢查新值是否等於舊值。如果不等,則發射ValueChanged()訊號,又因為 ValueChanged()訊號被連線到ChangeValue槽,因此當發射ValueChanged()訊號時將執行ChangeValue() 槽。之後,ChangeValue()槽呼叫FunctionForChangingTheValue()函式去修改實際資料。

二,視覺化設計模式

1,設計工具設計介面   ui_xx.h

2,新建類繼承上面的介面,並設計自定義函式和訊號 槽

xx.h

#include "ui_xx.h"

宣告一個新的類,

繼承設計介面,

並派生新的函式  訊號  槽(可參考上面程式碼)

xx.cpp

實現類