qt學習筆記(五)之淺析信號與槽進制

一、原理

Qt的"信號與槽",筆者是這麼理解的--"回調機制”。

在Gui用戶界面中,往往有這種需求,“動作”一個窗口部件,需要激活其他的操作。這種功能,我們經常使用回調函數來實現。

在MINIGui中,也提供了一套類似的機制,就是postmessage、sendmessage。(呵呵,其實也是windows的機制啦~~)

信號與槽的關聯有以下幾種方式:

一個信號與一個槽關聯;

一個信號與多個槽關聯:槽函數的執行順序是隨機的,與關聯的順序無關;

多個信號與一個槽關聯;

信號與信號關聯:當第一個信號觸發後,會激發Qt去發送第二個信號

二、函數解析

QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, constchar * method, Qt::ConnectionType type = Qt::AutoConnection )

信號與槽通過QObject::connect(..)進行關聯。

send是信號的發送者,必須是一個QObject類對象。

singal就是一個信號,Qt本身提供了一些信號。例如按鈕的clicked();對話框的accept()、reject()等等。

當對象的狀態發生改變時,信號被某一個對象發射(emit)。只有定義過這個信號的類或其派生類能夠發射這個信號。當一個信號被髮射時,與其相關聯的槽將被執行,就像一個正常的函數調用一樣。

method是槽函數。

type定義了信號與槽的關聯方式:

Qt::DirectConnection信號發出去,等待槽函數返回才能繼續執行之後的代碼;

Qt::QueuedConnection:信號發出去,"就不管了",立即執行發送信號之後的代碼;

Qt::AutoConnection 相當於上面2個方式結合起來,當信號與槽在同一線程時,等同於Qt::DirectConnection;而在不同線程,效果等同於Qt::QueuedConnection。

這點和MNIGUI異曲同工。(GUI的基本原理是共通的~~~)

QObject::connect(pushbutton, SIGNAL(clicked), label, SLOT(on_btn_slot()));
上面的函數實例就是將信號與槽關聯起來。

SIGNAL和SLOT都是宏,返回類型是(const char *)

注意點:
1、如果在應用程序加入了信號與槽,則必須在類聲明加入Q_OBJECT宏。

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void on_btn_slot();
private:
    Ui::MainWindow *ui;
};

2、public slots意味着void on_btn_slot() 是槽函數。on_btn_slot()既可以當槽函數,也可以作爲普通函數來使用。但要注意的一點就是,作爲普通函數使用的時候,返回類型有效,而當成槽函數使用,Qt是忽略其返回類型的。

3、“參數對應”原則

信號的參數類型、個數與槽的參數類型、個數是“相同的”,不過槽的參數個數可以少於信號的參數個數,缺少的參數必須是最後n個參數。

4、宏定義不能用在signal和slot的參數中

5、構造函數不能用在signals或者slots聲明區域內

6、函數指針不能作爲信號或槽的參數

7、信號與槽不能有缺省參數

8、信號與槽也不能攜帶模板類參數

9、相關聯的信號與槽是可以取消關聯的。disconnect();

MIGUI的消息機制、Qt的信號與槽機制等都減少了應用程序的耦合度,良好的程序框架~~。雖然效率對於回調函數來說相對低下,~~~但是是可以忽略的。強大的windows開發消息機制,是吧~~親!

三、信號與槽自動關聯

我們通常手動關聯信號與槽。Qt還提供了自動關聯方法。

如果不是在(*.ui)創建的窗口部件,首先必須在類構造函數內加入下面一行代碼。

QMetaObject::connectSlotsByName(this);
對於Qt窗口部件已經提供的信號,如果能按下面的規則命名槽函數,那麼Qt就能夠自動進行關聯

void on<窗口部件名>_<信號名>(<信號參數>);

這裏要注意 窗口部件名爲objectname,與我們命名的窗口部件變量名是不一樣的。

我們可以通過void QObject::setObjectName(constQString&name) 來設置窗口部件名

在這裏附上程序源代碼下載鏈接:http://download.csdn.net/detail/fzu_dianzi/3746787

以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章