日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT信号和槽函数学习笔记

發布時間:2023/12/1 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT信号和槽函数学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//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函數斷開
*
*/

轉載于:https://www.cnblogs.com/guolongzheng/p/7726338.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的QT信号和槽函数学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。