1. 程式人生 > >Qt訊號和槽機制簡單例子

Qt訊號和槽機制簡單例子

訊號和槽機制概述:

訊號和槽用於兩個物件之間的通訊。訊號和槽機制是Qt的核心特徵,也是Qt不同於其他開發框架最突出特徵。有時候,我們希望某個物件任何時候都可以跟其他物件通訊。例如,有一個物件A,定時向B傳送一個數字,物件B接收到該數字就將其打印出來。又或者有一個按鈕,當用戶點選該按鈕時呼叫close()來關閉視窗。為了實現這些功能,一些工具包中使用了回撥(callback)機制,而在Qt中使用訊號和槽來進行物件間的通訊。

簡單的例子:

建立兩個物件MySignal和MySlot,使用connect將兩個物件關聯起來,MySlot傳送5次訊號,MySignal將從MySlot接收到的訊號分別打印出來。

mysignal.h

#ifndef MYSIGNAL_H
#define MYSIGNAL_H

#include <QObject>

class MySignal:public QObject
{
    Q_OBJECT   //使用這個巨集才可使用訊號槽
public:
    MySignal();
    void run();

signals:
    void myslot(int a);     //宣告一個訊號,不需要實現

private:
    int a;
};

#endif // MYSIGNAL_H

mysignal.cpp

#include "mysignal.h"
MySignal::MySignal()
{

}

void MySignal::run()
{
    for(int i=0;i<5;i++)
    {
        emit myslot(i);   //發射訊號
    }
}

myslot.h

#ifndef MYSLOT_H
#define MYSLOT_H

#include <QObject>

class MySlot:public QObject
{
    Q_OBJECT      //使用這個巨集才可使用訊號槽
public:
    MySlot();

public slots:
    void coutI(int a);    //宣告一個槽函式
};

#endif // MYSLOT_H

myslot.cpp

#include "myslot.h"
#include <QDebug>

MySlot::MySlot()
{

}

void MySlot::coutI(int a)
{
    qDebug() << "nums is" << a;
}


main.cpp

#include <QCoreApplication>
#include "mysignal.h"
#include "myslot.h"
//#include <QObject>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MySlot slo;
    MySignal *sig = new MySignal;

    //將訊號槽進行連線
    QObject::connect(sig,SIGNAL(myslot(int)),&slo,SLOT(coutI(int)));

    sig->run();


    return a.exec();
}

執行結果:

 總結:

1)實現訊號和槽的類必須包含Q_OBJECT巨集

2)訊號需要宣告在signals保留字下,並不需要實現

3)槽宣告在slots保留字下,需要實現函式

4)訊號和槽通過QObject::connect函式連線

5)當訊號被觸發時,槽函式被呼叫

注意:

1)訊號和槽機制是Qt的擴充套件,所以實現訊號和槽的類必須是QObject類的子類;

2)連線訊號和槽,要用到SIGNAL和SLOT兩個巨集將,轉換函式為字串;

3)訊號宣告為void型別,如void _slot()

4)一個訊號可以連線多個槽,槽的呼叫順序為連線的順序;

5)多個訊號可以連線一個槽;

6)訊號可以連線訊號,形成訊號傳導;

7)訊號和槽的引數應該一樣多,並且引數型別相同;

8)訊號和槽都可以過載;

9)訊號和槽可以有預設引數;

10)槽函式可以和普通函式一樣被呼叫;

11)在槽函式中使用sender可以獲得訊號擁有者;

記住幾個關鍵詞:

一個類:QObject

三個巨集:O_OBJECT、SIGNAL、SLOT

三個保留字:signals、slots、emit