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