信號槽是Qt中特有的概念。它使得程序員將不同的object綁定起來,而object對象間並不需要對相互了解。 Slots也是普通的c++方法,它們可以是virtual;可以被重載;可以使private、protected、public,可以像其它c++方法一樣有各種類型的參數,Signals則無這些屬性。它們唯一的區別就是signal與slot是相互鏈接起來的,slot函數在每次signal函數被emit時會被調用。
聲明信號,跟函數不一樣,不需要定義
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
在用到的地方發送信號(先建立了信號與槽的連接,才能接受信號)
emit mySignal();
聲明槽,slots有public等屬性,槽就相當於定義的一個函數,在里面實現某些功能。
public slots:
void mySlot();
void mySlot(int x);
void mySlot(int x,int y);
連接信號signal和槽函數slot:
connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()));
sender和receiver是QObject對象的指針,signal和slot函數是不帶參數的函數名,實際上SIGNAL()和SLOT()宏將他們的參數(signal和slot函數)轉換成相應的字符串。
注意
1、一個信號可以連接到多個槽:
connect(sender, SIGNAL(mySignal(int)),receiver1, SLOT(mySlot(int)));
connect(sender, SIGNAL(mySignal(int),receiver2, SLOT(mySlot(int)));
當信號發出后,槽函數都會被調用,但是調用的順序是隨機的,不確定的。
2、多個信號可以連接到同一個槽
connect(sender1 SIGNAL(mySignal1()), receiver, SLOT(mySlot()));
connect(sender2, SIGNAL(mySignal2()),receiver, SLOT(mySlot()));
任何一個信號發出,槽函數都會執行。
3、一個信號可以和另一個信號相連
connect(sender, SIGNAL(mySignal1()),
this, SIGNAL(mySignal2()));
第一個信號發出后,第二個信號也同時發送。除此之外,信號與信號的連接和信號與槽連接相同。
4、連接可以被刪除
disconnect(sender, SIGNAL(mySignal()),receiver, SLOT(mySlot()));
這個函數很少使用,因為當一個對象被刪除后,Qt自動刪除這個對象的所有連接。
5、參數設置
信號和槽函數必須有着相同的參數類型及順序,這樣信號和槽函數才能成功連接:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int, const QString &)));
如果信號里的參數個數多於槽函數的參數,多余的參數被忽略:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int)));
6、獲得對象
QObject * QObject::sender () const [protected]
sender () 函數返回 信號發出者 的 QObject型指針。
對QObject型指針進行強制轉換得到需要的。
在槽函數里使用得到信號發送對象。
例如:
mySlot(){
currentGlWidget = qobject_cast<GLWidget *>(sender());
QPushButton* btn= dynamic_cast<QPushButton*>(sender())
}
帶返回值的信號槽
槽函數有返回值
可通過 value = emit mysignal() 得到返回值。
http://blog.csdn.net/zmy3376365/article/details/7590987