QT信號槽的六個優點(雖然直接調用函數也可解決問題,但要在具體的函數中傳遞指針,多對一和解除關系也夠麻煩的)


        信號槽是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM