QT 自定義函式 自定義訊號和槽
阿新 • • 發佈:2019-02-03
在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
實現類