訊號和槽

來源:互聯網
上載者:User

   你可以為一個槽串連多個訊號, 同樣一個訊號也可以被串連到多個槽.甚至於你可以把一個
    訊號直接連接到其他訊號. (在第一個訊號發送後將馬上發送第二個訊號.)

    總之, 訊號和槽形成了一個強大的組件編程機制.

 

一個很小的基於對象聲明如下:
     #include <QObject>

     class Counter : public QObject
     {
         Q_OBJECT

     public:
         Counter() { m_value = 0; }

         int value() const { return m_value; }

     public slots:
         void setValue(int value);

     signals:
         void valueChanged(int newValue);

     private:
         int m_value;
     };

    這個類可以通過發送訊號 valueChanged(), 來告訴外
    部世界它的狀態改變,並且它有一個可以接受其他對象發送訊號的槽. 
    所有包含訊號或者槽的類都應該在聲明的頂部使用 Q_OBJECT.它們都是從QObject派生而來. 
    槽由應用開發程式員來實現. 下面是一個對槽 Counter::setValue() 的實現:

     void Counter::setValue(int value)
     {
         if (value != m_value) {
             m_value = value;
             emit valueChanged(value);
         }
     }

    其中含有 emit 的行從該對象內部使用 value 作為參數發送 valueChanged() 訊號.

 在以下代碼片斷中, 我們建立兩個 Counter 對象並使用 QObject::connect() 串連第一個
    對象的 valueChanged() 訊號到第二個對象的 setValue() 槽:
    
     Counter a, b;
     QObject::connect(&a, SIGNAL(valueChanged(int)),
                      &b, SLOT(setValue(int)));

     a.setValue(12);     // a.value() == 12, b.value() == 12
     b.setValue(48);     // a.value() == 12, b.value() == 48

    調用 a.setValue(12) 將發送一個 valueChanged(12) 訊號, 將由槽 setValue() 接收,
    也就是將調用 b.setValue(12). 然後 b 同樣發動一個 valueChanged(),但是由於沒有槽
    串連到 b 的 valueChanged() 訊號, 因此該訊號將被忽略.

    注意函數 setValue() 只有在 value != m_value 時設定相應的值並且發送訊號.這是為了
    阻止防止迴圈串連時導致無限迴圈(例如,當b.valueChanged() 被串連到a.setValue()時).

    一個訊號將被發送到每一個該訊號的串連; 如果你重複串連一次,則將會發送兩個訊號. 
    不論何時,你都可以使用 QObject::disconnect() 來中斷連線. 
 訊號應該由 moc自動產生並且不應該在 .cpp 源檔案中實現它.它們永遠沒有傳回值(因此
    使用 void 作為傳回值).

 

slot函數的傳回值是沒有意義的,signal函數是由moc編譯器實現的,從具體實現來看,不關心slot函數的傳回值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.