Qt 信號自定義槽函數(shù)的實(shí)現(xiàn)
Qt中實(shí)現(xiàn)自定義信號與槽函數(shù),信號用于發(fā)送并觸發(fā)槽函數(shù),槽函數(shù)則是具體的功能實(shí)現(xiàn),如下我們以老師學(xué)生為例子簡單學(xué)習(xí)一下信號與槽函數(shù)的使用方法。
使用無參數(shù)信號與槽
首先定義一個(gè)teacher類,該類中用于發(fā)送一個(gè)信號,其次student類,定義用于接收該信號的槽函數(shù),最后在widget中使用emit觸發(fā)信號,當(dāng)老師說下課時(shí),學(xué)生請客吃飯。
teacher.h 中只需要定義信號。定義一個(gè) void hungry(); 信號。
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
// 定義一個(gè)信號,信號必須為void類型,且信號不能實(shí)現(xiàn)
void hungry();
};
#endif // TEACHER_H
student中需要定義槽聲明,并實(shí)現(xiàn)槽。
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 自定義槽函數(shù)
// 槽函數(shù)必須定義且必須要聲明才可以使用
void treat();
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
// 槽函數(shù)的實(shí)現(xiàn)過程如下
void Student::treat()
{
qDebug() << "請老師吃飯";
}
Widget.h定義信號發(fā)送函數(shù),與類
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "student.h"
#include "teacher.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 定義學(xué)生與老師類
Teacher *zt;
Student *st;
// 定義信號發(fā)送函數(shù)
void classIsOver();
};
#endif // WIDGET_H
Widget.cpp 具體實(shí)現(xiàn)
#include "widget.h"
Widget::Widget(QWidget *parent): QWidget(parent)
{
zt = new Teacher(this);
st = new Student(this);
// zt向st發(fā)送信號,信號是&Teacher::hungry 處理槽函數(shù)是 &Student::treat
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
Widget::~Widget()
{
}
// 觸發(fā)信號
void Widget::classIsOver()
{
emit zt->hungry();
}
使用有參信號傳遞
只需要再無參基礎(chǔ)上改進(jìn)
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent): QWidget(parent)
{
zt = new Teacher(this);
st = new Student(this);
void(Teacher:: *teacherPtr)(QString) = &Teacher::hungry;
void(Student:: *studentPtr)(QString) = &Student::treat;
connect(zt,teacherPtr,st,studentPtr);
classIsOver();
}
Widget::~Widget()
{
}
// 觸發(fā)信號
void Widget::classIsOver()
{
emit zt->hungry("kao'leng'mian烤冷面");
}
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
// 槽函數(shù)的實(shí)現(xiàn)過程如下
void Student::treat()
{
qDebug() << "請老師吃飯";
}
void Student::treat(QString foodName)
{
qDebug() << "請老師吃飯了!,老師要吃:" << foodName.toUtf8().data() ;
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 自定義槽函數(shù)
// 槽函數(shù)必須定義且必須要聲明才可以使用
void treat();
void treat(QString);
};
#endif // STUDENT_H
teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
// 定義一個(gè)信號,信號必須為void類型,且信號不能實(shí)現(xiàn)
void hungry();
void hungry( QString foodName );
};
#endif // TEACHER_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QString>
#include <QPushButton>
#include "student.h"
#include "teacher.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 定義學(xué)生與老師類
Teacher *zt;
Student *st;
// 定義信號發(fā)送函數(shù)
void classIsOver();
};
#endif // WIDGET_H
點(diǎn)擊按鈕觸發(fā)信號
當(dāng)我們點(diǎn)擊按鈕時(shí),自動觸發(fā)信號。只需需改widget中的內(nèi)容。
Widget::Widget(QWidget *parent): QWidget(parent)
{
st = new Student(this);
tt = new Teacher(this);
QPushButton *btn = new QPushButton("發(fā)送郵件",this);
void(Teacher:: *teacherPtr)(void) = &Teacher::send_mail;
void(Student:: *studentPtr)(void) = &Student::read_mail;
// 將btn綁定到button上,點(diǎn)擊后觸發(fā)tt 里面的teacherPtr -> 產(chǎn)生信號send_mail;
connect(btn,&QPushButton::clicked,tt,teacherPtr);
// 接著將產(chǎn)生信號綁定到 st 里面的student -> 也就是read_mail槽函數(shù)上。
connect(tt,teacherPtr,st,studentPtr);
}
匿名函數(shù)與槽
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
// 使用Lambda表達(dá)式,其中的[=] 對文件內(nèi)的變量生效,其中[btn]則是對btn按鈕生效
// 默認(rèn)會調(diào)用一次完成初始化,這是由()決定的函數(shù)調(diào)用。
[=](){
this->setWindowTitle("初始化..");
}();
// 使用mutable可以改變通過值傳遞的變量
int number = 10;
QPushButton *btn_ptr1 = new QPushButton("改變變量值",this);
btn_ptr1->move(100,100);
// 點(diǎn)擊按鈕改變內(nèi)部變量的值,由于值傳遞所以不會影響外部變量的變化
connect(btn_ptr1,&QPushButton::clicked,this,[=]()mutable{
number = number + 100;
std::cout << "inner: " << number << std::endl;
});
// 當(dāng)點(diǎn)擊以下按鈕時(shí)number還是原值
QPushButton *btn_ptr2 = new QPushButton("測試值傳遞",this);
btn_ptr2->move(100,200);
connect(btn_ptr2,&QPushButton::clicked,this,[=](){
std::cout << "The Value: " << number << std::endl;
});
// 使用Lambda表達(dá)式返回值,有時(shí)存在返回的情況
int ref = []()->int{
return 1000;
}();
std::cout << "Return = " << ref << std::endl;
}
到此這篇關(guān)于Qt 信號自定義槽函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 信號自定義槽函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理
本文對類的構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行總結(jié),主要包括了構(gòu)造函數(shù)的初始化、重載、使用參數(shù)和默認(rèn)參數(shù),拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),希望能幫助讀者在程序開發(fā)中更好的理解類,屬于C/C++基礎(chǔ)2022-05-05
C語言實(shí)現(xiàn)查看進(jìn)程是否存在的方法示例
這篇文章主要介紹了C語言實(shí)現(xiàn)查看進(jìn)程是否存在的方法,涉及C語言針對進(jìn)程操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07
C語言 while for do while循環(huán)體詳解用法
在不少實(shí)際問題中有許多具有規(guī)律性的重復(fù)操作,因此在程序中就需要重復(fù)執(zhí)行某些語句。一組被重復(fù)執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復(fù),決定循環(huán)的終止條件2021-10-10
Clion-MinGW編譯后的exe文件添加ico圖標(biāo)的操作方法
這篇文章主要介紹了Clion-MinGW編譯后的exe文件添加ico圖標(biāo)的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
VSCode斷點(diǎn)調(diào)試CMake工程項(xiàng)目的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCode斷點(diǎn)調(diào)試CMake工程項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C語言循環(huán)隊(duì)列與用隊(duì)列實(shí)現(xiàn)棧問題解析
循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問題,本篇帶你一起看看循環(huán)隊(duì)列的問題和怎樣用隊(duì)列實(shí)現(xiàn)棧2022-04-04
深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果
本篇文章是對父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
用c語言實(shí)現(xiàn)一個(gè)電話薄(附完整代碼)
大家好,本篇文章主要講的是用c語言實(shí)現(xiàn)一個(gè)電話薄(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01

