我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Qt信号自定义槽函数的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Qt信号自定义槽函数的实现

Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法。

使用无参数信号与槽

首先定义一个teacher类,该类中用于发送一个信号,其次student类,定义用于接收该信号的槽函数,最后在widget中使用emit触发信号,当老师说下课时,学生请客吃饭。

teacher.h 中只需要定义信号。定义一个 void hungry(); 信号。


#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
    // 定义一个信号,信号必须为void类型,且信号不能实现
    void hungry();
};

#endif // TEACHER_H

student中需要定义槽声明,并实现槽。

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:
    // 自定义槽函数
    // 槽函数必须定义且必须要声明才可以使用
    void treat();
};

#endif // STUDENT_H

student.cpp


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

Student::Student(QObject *parent) : QObject(parent)
{

}

// 槽函数的实现过程如下
void Student::treat()
{
    qDebug() << "请老师吃饭";
}

Widget.h定义信号发送函数,与类


#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();

    // 定义学生与老师类
    Teacher *zt;
    Student *st;

    // 定义信号发送函数
    void classIsOver();

};
#endif // WIDGET_H

Widget.cpp 具体实现


#include "widget.h"

Widget::Widget(QWidget *parent): QWidget(parent)
{
    zt = new Teacher(this);
    st = new Student(this);

    // zt向st发送信号,信号是&Teacher::hungry 处理槽函数是 &Student::treat
    connect(zt,&Teacher::hungry,st,&Student::treat);

    classIsOver();
}

Widget::~Widget()
{
}

// 触发信号
void Widget::classIsOver()
{
    emit zt->hungry();
}

使用有参信号传递

只需要再无参基础上改进

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()
{
}

// 触发信号
void Widget::classIsOver()
{
    emit zt->hungry("kao'leng'mian烤冷面");
}

student.cpp


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

Student::Student(QObject *parent) : QObject(parent)
{

}

// 槽函数的实现过程如下
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:
    // 自定义槽函数
    // 槽函数必须定义且必须要声明才可以使用
    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:
    // 定义一个信号,信号必须为void类型,且信号不能实现
    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();

    // 定义学生与老师类
    Teacher *zt;
    Student *st;

    // 定义信号发送函数
    void classIsOver();

};
#endif // WIDGET_H

点击按钮触发信号

当我们点击按钮时,自动触发信号。只需需改widget中的内容。


Widget::Widget(QWidget *parent): QWidget(parent)
{
    st = new Student(this);
    tt = new Teacher(this);

    QPushButton *btn = new QPushButton("发送邮件",this);

    void(Teacher:: *teacherPtr)(void) = &Teacher::send_mail;
    void(Student:: *studentPtr)(void) = &Student::read_mail;

    // 将btn绑定到button上,点击后触发tt 里面的teacherPtr -> 产生信号send_mail;
    connect(btn,&QPushButton::clicked,tt,teacherPtr);
    // 接着将产生信号绑定到 st 里面的student -> 也就是read_mail槽函数上。
    connect(tt,teacherPtr,st,studentPtr);
}

匿名函数与槽


Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{

    ui->setupUi(this);

    // 使用Lambda表达式,其中的[=] 对文件内的变量生效,其中[btn]则是对btn按钮生效
    // 默认会调用一次完成初始化,这是由()决定的函数调用。
    [=](){
        this->setWindowTitle("初始化..");
    }();

    // 使用mutable可以改变通过值传递的变量
    int number = 10;

    QPushButton *btn_ptr1 = new QPushButton("改变变量值",this);
    btn_ptr1->move(100,100);

    // 点击按钮改变内部变量的值,由于值传递所以不会影响外部变量的变化
    connect(btn_ptr1,&QPushButton::clicked,this,[=]()mutable{
       number = number + 100;
       std::cout << "inner: " << number << std::endl;
    });

    // 当点击以下按钮时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表达式返回值,有时存在返回的情况
    int ref = []()->int{
        return 1000;
    }();
    std::cout << "Return = " << ref << std::endl;
}

到此这篇关于Qt 信号自定义槽函数的实现的文章就介绍到这了,更多相关Qt 信号自定义槽函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Qt信号自定义槽函数的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何进行Qt 信号自定义槽函数的实现

本篇文章为大家展示了如何进行Qt 信号自定义槽函数的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师
2023-06-21

QT如何找到信号连接的槽函数

在Qt中,可以通过以下几种方式找到信号连接的槽函数:1. 使用QObject的`findChild()`方法:该方法可以通过对象名称查找子对象,并返回匹配的QObject指针。因此,可以通过查找QObject的子对象来找到信号连接的槽函数。
2023-09-27

golang函数自定义实现原理

在 go 语言中,可自定义函数的实现原理如下:定义函数签名:func () 赋予函数值:函数作为值类型,可赋值给变量、传递或返回。调用函数:使用圆括号括起来的函数名后跟参数列表。实战案例:阶乘计算函数:func factorial(n in
golang函数自定义实现原理
2024-04-26

golang函数自定义实现的高级技术

go 函数高级技术包括:闭包:用于访问外部定义的变量,可封装状态并创建私有变量。匿名函数:一次性操作使用的未命名函数,适用于回调、事件处理和筛选。函数类型:定义函数签名,可存储和传递函数值,用于比较和排序等场景。Go 中函数自定义实现的高级
golang函数自定义实现的高级技术
2024-04-28

golang函数自定义实现的安全考虑

在go语言中自定义函数实现时,安全注意事项包括:1. 检查变量作用域以防止泄漏或篡改;2. 确保函数参数和返回值的类型与预期一致;3. 执行边界检查以防止越界访问;4. 显式检查空指针并处理错误情况;5. 注意并发访问以避免数据竞争。通过考
golang函数自定义实现的安全考虑
2024-04-27

如何在golang中自定义实现函数?

在 go 中实现自定义函数,需要使用 func 关键字后跟函数名、参数列表和返回类型(可选)。通过调用函数名和提供适当参数即可调用自定义函数。自定义函数可用于各种任务,例如处理数据、格式化输出或创建可重用代码块。如何在 Go 中自定义实现函
如何在golang中自定义实现函数?
2024-04-28

使用golang自定义函数实现实现特定领域的语言

使用 go 语言自定义函数可扩展特定领域的语言,其步骤为:创建自定义函数,定义特定领域问题的可重用代码块。在程序中使用自定义函数,简化和优化代码。针对不同场景的需求,还可以创建更复杂的实战案例,例如处理 json 数据的自定义函数。使用 G
使用golang自定义函数实现实现特定领域的语言
2024-04-27

golang自定义函数实现的趋势和发展

答案: golang 中自定义函数的趋势包括 faas、异步编程和微服务架构。详细描述:faas: 允许开发人员在无需管理基础设施的情况下部署自定义函数。异步编程: 使用 go 的 goroutines 和通道机制,可以创建高效的自定义函数
golang自定义函数实现的趋势和发展
2024-04-26

golang自定义函数实现中的异常处理

在 go 中处理自定义函数异常有 3 种方法:使用 panic 内置函数(语法见文章)实战案例:define divide 函数,当除数为 0 时 panic优点:方便、可自定义错误消息、可在不同函数级别处理错误缺点:破坏程序流程、调试困难
golang自定义函数实现中的异常处理
2024-04-28

golang中自定义函数实现的常见错误

go 中自定义函数实现的常见错误包括:定义过长的函数,导致代码难以理解。缺少文档说明,使函数难以理解和使用。不处理错误,可能导致程序出现意外行为。产生副作用,使代码难以理解和测试。过度使用函数指针,增加代码复杂度。Go 中自定义函数实现的常
golang中自定义函数实现的常见错误
2024-04-26

PyTorch中怎么实现自定义损失函数

要实现自定义损失函数,可以按照以下步骤在PyTorch中实现:创建一个继承自torch.nn.Module的类,该类用于定义自定义损失函数的计算逻辑。import torchimport torch.nn as nnclass Custo
PyTorch中怎么实现自定义损失函数
2024-03-05

自定义golang函数实现的代码生成和自动化

在 go 中,可通过创建自定义函数来实现代码生成和自动化。代码生成函数接收参数列表,返回生成的代码和一个 error。自动化函数使用格式化的输出自动执行任务,接收参数列表并返回一个 error。实战案例包括一个函数,该函数可以根据参数生成配
自定义golang函数实现的代码生成和自动化
2024-04-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录