關於qt的訊號槽機制的理解

來源:互聯網
上載者:User

 

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中,訊號、槽提供的是同步觸發機制,事件提供非同步觸發機制。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.