//connect 函數有4個參數 分別是 發送者 信號。接受者 ,槽
//connect(sender,signal,receiver,slot)
/*
* 信號和槽
* 信號 就是一個普通的函數 定義信號的時候需要在函數前面加上signals: ,不需要實現
* 槽 函數 在QT5中科院是類的任意成員函數,靜態函數,全局函數 lambda 表達式
* QT4中槽函數的定義 public slots: void send();
* 信號和槽是可以自定義的
* 信號和槽是沒有返回值的
* 信號和槽函數可以帶參數
* 信號和槽函數的參數必須要一一對應的
* 信號和槽函數的參數可以是不一樣的但是槽函數的參數個數可以少于信號的參數個數
* 信號槽函數傳參數的數據類型:
* 先看QT4的
* connect(sender,SIGNAL(sig1(int,double,Qstring)),receiver,SLOT(slot1(int,double,Qstring)));
* SIGNAL 和SLOT 是兩個宏 將函數轉換成字符串
* 缺點 編譯時不會做錯誤檢查
* QT5中
* connect(sender,&sender::sig1,receiver,&receiver::slot1);
*/
//創建一個按鈕對象
QPushButton * Lpbutton =new QPushButton;
//將按鈕添加到主窗口中 設置按鈕的父窗口句柄
Lpbutton->setParent(this);
//設置按鈕的標題title
Lpbutton->setText("關閉窗口");
//信號和槽的簡單實現
//qt5的方式
// connect(Lpbutton,&QPushButton::clicked,this,&MyWidget::close);
//Qt4的方式
connect(Lpbutton,SIGNAL(clicked(bool)),this,SLOT(close()));
自定義信號和槽函數的使用
創建兩個類 一個報紙類一個讀者類
報紙類先聲明 信號和發送信號的函數
//然后我們定義一個發送信號的函數
void SendSignals();
signals:
//自定義一個信號
void signalFunc(); //沒有返回值 不需要實現
然后 我們來實現發送信號的函數
void NewSpaper::SendSignals()
{
//這個函數的主要作用就是發送信號
//在QT中我們要發送信號的話需要用到關鍵字emit信號的函數名
emit signalFunc();
}
下面我們再來處理讀者類的槽函數
public slots:
//讀者類中我們需要自定義一個槽函數
void SlostFunc();
實現槽函數功能
void Reader::SlostFunc()
{
//我們來實現以下槽函數 這里需要用到 控制臺打印調試信息所以我們需要用到
//一個QDebug類
qDebug() <<"我要去買報紙";
}
連接信號和槽函數
//創建讀者類和報紙類
NewSpaper* NewSpa1 =new NewSpaper;
Reader* Read1 = new Reader;
//連接信號和槽
connect(NewSpa1,&NewSpaper::signalFunc,Read1,&Reader::SlostFunc);
//然后是發送信號
NewSpa1->SendSignals();
當然信號和槽函數在c++中是一個普通的函數 它也存在重載機制
下面我們來重載信號和槽函數
重載報紙的構造函數
explicit NewSpaper(QString name,QObject *parent = 0);
//重載信號
void signalFunc(QString name); //沒有返回值 不需要實現
NewSpaper::NewSpaper(QString name,QObject *parent) : QObject(parent)
{
Qs_name = name;
}
void NewSpaper::SendSignals()
{
//這個函數的主要作用就是發送信號
//在QT中我們要發送信號的話需要用到關鍵字emit信號的函數名
emit signalFunc();
emit signalFunc(Qs_name);
}
重載讀者的槽函數
//重載槽函數
void SlostFunc(QString name);
//重載槽函數
void Reader::SlostFunc(QString name)
{
qDebug() <<"我要去買:"<<name.toStdString().c_str();
}
Reader* Read1 = new Reader;
NewSpaper* NewSpa2 =new NewSpaper("人民日報"); //重載信號函數
//連接信號和槽
// connect(NewSpa1,&NewSpaper::signalFunc,Read1,&Reader::SlostFunc);
//QT4方式實現重載信號槽函數的連接
// connect(NewSpa2,SIGNAL(signalFunc(QString)),Read1,SLOT(SlostFunc(QString)));
//QT5方式實現重載信號槽函數的連接 主要是用到類型轉換 函數指針轉換即可
connect(NewSpa2,static_cast<void (NewSpaper::*)(QString)>(&NewSpaper::signalFunc),Read1,static_cast<void (Reader::*)(QString)>(&Reader::SlostFunc));
//然后是發送信號
NewSpa2->SendSignals();
QT中信號和槽的擴展
//信號和槽的擴展
/*
* 一個信號可以連接多個槽函數
* 槽函數的執行順序是隨機的無法控制
* 一個槽函數可以同時被多個信號連接
* 槽函數可以使用lambda表達式
* 信號可以連接信號可以接力
* 先連接第一個信號槽
* connect(NewSpa2,static_cast<void (NewSpaper::*)()>(&NewSpaper::signalFunc),Read1,static_cast<void (Reader::*)()>(&Reader::SlostFunc));
* 然后再連接第二個信號槽
* connect(Lpbutton,&QPushButton::clicked,NewSpa2,static_cast<void (NewSpaper::*)()>(&NewSpaper::signalFunc));
* 信號槽連接之后可以被斷開。可以使用disconnect函數斷開
*
*/