槽和普通成員函數一樣,可以是虛函數、被重載,可以是公有、私有、保護的。它可以被其它C++成員函數調用。
槽連接了信號,當發射這個信號時,槽會被自動調用。
連接函數:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )
sender和receiver是指向QObject的指針。
signal和method是不帶參數名的函數,需要使用宏SIGNAL()和SLOT()。
一個信號可以連接多個槽,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(okButton, SIGNAL(clicked(bool)),
checkBox2, SLOT(click()));
當點擊okButton時,checkBox1和checkBox2都會執行各自的槽click()。
多個信號可以連接同一個槽,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(cancelButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
點擊okButton或cancelButton時,checkBox1都會執行槽click()。
一個信號可以與另個一個信號連接,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
connect(cancelButton, SIGNAL(clicked(bool)),
okButton, SIGNAL(clicked(bool)));
當點擊cancelButton時,會由okButton的信號clicked(bool)做響應,okButton會發射信號clicked(bool),從而checkBox1的槽click()會自動執行。
另外,cancelButton的信號clicked(bool)中的bool參數會傳遞給okButton的信號clicked(bool)中的bool參數。
在這裡okButton的clicked(bool)信號被當作槽來使用,槽中有多少個參數,就會要求發射信號的函數至少要帶有多少個參數,否則連接是不成功的。
連接可以被移除,例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
disconnect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
當刪除對象時,Qt會自動刪除與這個對象相關的所有連接。
信號的參數數量至少是槽的參數數量。
1.例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(click()));
當發射信號時,信號的bool參數是沒有用的。
2.例如:
connect(okButton, SIGNAL(clicked(bool)),
checkBox1, SLOT(setHidden(bool));
當發射信號時,信號的bool參數會傳遞給槽的bool參數。
3.例如:
connect(checkBox1, SIGNAL(released()),
cancelButton, SLOT(setVisible(bool)));
這是錯誤的,槽要求一個bool參數,信號也必須有這一個bool參數。
4.例如:
connect(this, SIGNAL(send(bool, int, double)),
this, SLOT(recive(bool, int)));
信號的參數個數可以大於等於槽的參數個數,同時信號和槽的各個參數位置需要對應。
在這裡,信號的第三個參數double類型不會被傳遞到槽。
在成員函數中手動發射信號,使用emit,例如:
在對象創建時,構造函數就已經連接了setVal信號和recive槽。
當對象調用SetValue()函數時,全發射setVal信號,同時傳入相應的參數值,發射信號之後會由recive槽接收,設置val變量的值。
好咯,這一節的總結就到這裡~