QT的訊號和槽機制是QT的一大特色。解決了同步觸發問題,即提供了一種不同組件之間通訊機制,發送組件只知道發送什麼訊號,而接受組件只知道接受什麼訊號,實現了完美的封裝。
下面說一說這種機制,個人理解,可能很膚淺。做一下記錄,以整理思路。
QT提供了完美的機制,即你可以之間定義訊號和槽,自己管理同步,即你可以選擇什麼時候發送什麼訊號。這就好辦了,你一個程式之間的各個組件通訊問題就迎刃而解了。
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
void initconnect(void);
~MainWindow();
private:
Ui::MainWindow *ui;
QTimer *timer;
Win_QextSerialPort *myCom;
signals:
void valuechanged(void);
private slots:
void on_open_clicked(void);
};
上面是一個類的定義,是我從QT creator 上copy過來的。
使用訊號和槽的前提是繼承了Qobject類或者子類,然後還要使用Q_OBJECT這個宏。訊號和槽不是標準的c++程式,用了訊號和槽的程式要經過元編譯器把訊號和槽編譯成標準c++程式,然後再由c++編譯器編譯的。
這個訊號和槽的定義就很明確了,他們在QT中就像普通的函數一樣去定義。
有沒有區別,當然有了,其中訊號函數只定義就行了,不用去具體實現,因為他的作用就是發送一個訊號,沒有實際操作(發訊號這些機制被QT都封裝好了)。槽函數要自己去實現,槽函數就是接受到自己想要的東西時要執行的動作。
訊號和槽函數可以有參數,但必須一致,因為他們是要通過connect串連起來的。傳參也是他們乾的。哎對了,還沒說他們怎麼聯絡。是通過
connect(this,SIGNAL(valuechanged(void)),this,SLOT(on_open_clicked(void)));
這個語句要寫到類的函數裡面,看自己需求,當然可以放到建構函式裡了。這樣這兩個東西就聯絡起來了。它共有4個參數,很簡單。發送對象的指標,發送的訊號,接受對象的指標,接受訊號後乾的活。當然這個例子都是用的this指標,表示都是本對象。
好了,現在什麼都準備好了,誰發訊號,誰接受訊號,接受玩後幹什麼都準備好了,就剩下一個問題了,什麼實際發訊號。
好了,QT訊號和槽機制提供了發訊號的代碼 emit valuechanged()只要執行這個代碼,對應的槽就立即執行。好了,現在什麼都清楚了。呵呵
還有,一些事情使我們迷茫,有時候用一個元件時,比如pushbutton 就可以使用他已經有的訊號,比如clicked 。代表你使用者一用滑鼠按這個按鈕,他就發送這個訊號。這個吧,先說一下訊號、槽和事件的區別。前面也已經說了,訊號和槽是解決同一進程裡的同步觸發問題,也即解決了不同組件之間的內部通訊問題。而事件是解決的非同步觸發問題,比如你點擊滑鼠是不確定的事件,這些是QT的事件管理機制,關於這個機制,不想詳細說明,因為今天就是讓我們大家明白訊號、槽和事件的區別。
Mai函數裡的
return app.exec();
其實就是等待響應事件。
還說上面點擊滑鼠的問題,你點擊滑鼠是一個事件,這個事件觸發了一個clicked訊號,這個訊號影響了對應的槽。
好了,現在大家估計明白了,如果你想自己實現自己的非同步觸發機制,就只能自己定義事件了,放心qt提供了完美的機制來讓你定義事件。
最後再說一遍,在QT中,訊號、槽提供的是同步觸發機制,事件提供非同步觸發機制。