qt 信号和槽的简明使用

目录

1. connect函数 

2. 自定义的信号和槽

3. 带参数的信号和槽


1. connect函数 

connect(btn, &QPushButton::clicked, this, &Widget::close);

四个参数:

  • 参数1:信号发送者
  • 参数2:发送的信号signals(函数地址)
  • 参数3:信号接收者
  • 参数4:处理的slot槽函数(函数指针)
Widget::Widget(QWidget *parent): QWidget(parent)  // 用于初始化Widget类的基类,即QWidget。
{// 创建一个按钮QPushButton *btn = new QPushButton;btn->setParent(this);btn->setText(QString::fromLocal8Bit("按钮1"));// connect(信号发送者,发送的具体信号,信号接收者,信号的处理)connect(btn, &QPushButton::clicked, this, &QWidget::close);  // 点击按钮,关闭Widget
}

2. 自定义的信号和槽

信号:

  • 自定义信号,写在signals下。
  • 返回值是void,只需要声明,不需要实现
  • 可以有参数,所以可以重载

槽:

  • slots. 早期qt必须写在public slots下.
  • 返回值void,需要声明和实现
  • 可以有参数,所以可以重载

举个例子:下课了,触发老师发送饿了的信号,学生接受信号并进行请客吃饭事件。

程序:调用classIsOver(),触发老师hungry(), 学生接受信号并treat();

Teacher类

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:void hungry();  // 信号
};#endif // TEACHER_H
#include "teacher.h"Teacher::Teacher(QObject *parent): QObject{parent}
{}

Student类

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);void treat();  // 槽函数signals:
};#endif // STUDENT_H

触发函数,即下课了。

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "teacher.h"
#include "student.h"QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:// Ui::Widget *ui;Teacher *t;Student *s;void classIsOver();  // 触发函数
};
#endif // WIDGET_H
#include "widget.h"
// #include "ui_widget.h"// 下课后,老师饿了,学生请客吃饭。
Widget::Widget(QWidget *parent): QWidget(parent)
{// 信号发送者this->t = new Teacher();// 信号接收者this->s = new Student();// 绑定老师饿了,学生就请客吃饭connect(t, &Teacher::hungry, s, &Student::treat);// 调用触发函数classIsOver();
}Widget::~Widget()
{
}// 触发函数
void Widget::classIsOver()
{// 下课了,调用此触发函数classIsOver,触发老师饿了信号emit t->hungry();
}

3. 带参数的信号和槽

预备知识点

(1)普通函数指针:

int (*fp)(int a); // 这里就定义了一个指向函数(这个函数参数仅仅为一个 int 类型,函数返回值是 int 类型)的指针 fp。

(2)类函数指针:

int (Teacher:: *fp)(int a);  // 指向的是Teacher类中函数,该函数参数是int类型,返回值是int,指针变量是fp;

void (Teacher:: *teacherSignal)(QString foodName) = &Teacher::hungry;  // 指向的Teacher类中的hungry函数,该函数参数是QString类型,返回void类型。

同样用上面的吃饭例子:

下课了,触发老师饿了,老师吃烧鸡,学生接收吃烧鸡信号并请客。

// 触发函数
void Widget::classIsOver()
{// 下课了,调用此触发函数,触发老师饿了信号// emit t->hungry();emit t->hungry("烧鸡");  // Teacher *t;
}

Teacher类型,加一个带参声明。

#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:// 自定义信号,写在signals下。// 返回值是void,只需要声明,不需要实现// 可以有参数,所以可以重载void hungry();void hungry(QString foodName);
};#endif // TEACHER_H

Student类加一个带参函数

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>class Student : public QObject
{Q_OBJECT
public:explicit Student(QObject *parent = nullptr);// slots. 早期qt必须写在public slots下.// 返回值void,需要声明和实现// 可以有参数,所以可以重载void treat();void treat(QString foodName);
signals:
};#endif // STUDENT_H
#include "student.h"
#include <QDebug>Student::Student(QObject *parent): QObject{parent}
{}void Student::treat()
{qDebug() << "请老师吃饭!";
}void Student::treat(QString foodName)
{qDebug() << "eat: " << foodName;  // eat:  "烧鸡"qDebug() << "eat: " << foodName.toUtf8().data();  // eat:  烧鸡
}

定义函数指针,关联信号和槽

// 绑定老师饿了,学生就请客吃饭
// connect(t, &Teacher::hungry, s, &Student::treat);  // 不带参void (Teacher:: *teacherSignal)(QString foodName) = &Teacher::hungry;
void (Student:: *studentSlot)(QString foodName) = &Student::treat;
connect(t, teacherSignal, s, studentSlot);  // 不带参// 调用触发函数
classIsOver();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/237477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM启动流程(JDK8)

JVM启动流程(JDK8) JVM的启动入口是位于jdk/src/share/bin/java.c的JLI_Launch函数,其定义如下: int JLI_Launch(int argc, char ** argv, /* main argc, argc */int jargc, const char** jargv, /* java args */int appclassc, const char** appclass…

centos7安装开源日志系统graylog5.1.2

安装包链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Zl5s7x1zMWpuKfaePy0gPg?pwd1eup 提取码&#xff1a;1eup 这里采用的shell脚本安装&#xff0c;脚本如下&#xff1a; 先使用命令产生2个参数代入到脚本中&#xff1a; 使用pwgen生成password_secret密码 …

Java Web Day07

Layui概念介绍 layui&#xff08;谐音&#xff1a;类 UI) 是一套开源的 Web UI 解决方案&#xff0c;采用自身经典的模块化规范&#xff0c;并遵循原生 HTML/CSS/JS 的开发方式&#xff0c;极易上手&#xff0c;拿来即用。其风格简约轻盈&#xff0c;而组件优雅丰盈&#xff0c…

在ClickHouse数据库中启用预测功能

在这篇博文中&#xff0c;我们将介绍如何将机器学习支持的预测功能与 ClickHouse 数据库集成。ClickHouse 是一个快速、开源、面向列的 SQL 数据库&#xff0c;对于数据分析和实时分析非常有用。该项目由 ClickHouse&#xff0c; Inc. 维护和支持。我们将探索它在需要数据准备以…

C++中多态的原理

文章目录 前言多态的原理多态的条件要求虚函数表用程序打印虚表多继承的虚函数表静态多态和动态多态菱形虚拟继承 前言 上篇讲解了多态的原理&#xff0c;这篇文章来详细讲解一下多态的原理。 这里有一道常考笔试题&#xff1a;sizeof(Base)是多少&#xff1f; 为什么不是8&…

【CF闯关练习】—— 800分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。

腾讯云发布升级版金融音视频解决方案,提供全新架构、安全和特性

远程银行、视频尽调、全媒体客服、路演直播……近年来&#xff0c;音视频技术支撑下的非接触式金融服务&#xff0c;成为了金融机构数字化转型和探索服务创新的重要方向。 12月21日&#xff0c;腾讯云正式发布升级版金融级音视频解决方案。新方案在架构、安全和特性上进行全面…

使用 stream 流构建树(不使用递归)

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言代码实现定义测试实体类实现方法 前言 最近遇到一个地区数据需要转换成树的需求&#xff0c;研究了一种…

系统学习Python——装饰器:基础知识-[类装饰器:使用方法]

分类目录&#xff1a;《系统学习Python》总目录 前面的文章证明了函数装饰器已经被如此有用&#xff0c;以至于这一模式从Python2.6和Python3.0起就被扩展&#xff0c;并允许使用类装饰器。因为与元类相重叠的角色&#xff0c;它们最初是被抵制的&#xff1b;然而因为它们提供了…

CentOS系统环境搭建(二十五)——使用docker compose安装mysql

centos系统环境搭建专栏&#x1f517;点击跳转 文章目录 使用docker compose安装mysqlMySQL81.新建文件夹2.创建docker-compose.yaml3.创建my.cnf4.mysql容器的启动和关闭 MySQL5.71.新建文件夹2.创建docker-compose.yaml3.创建my.cnf4.mysql容器的启动和关闭 使用docker comp…

【数字图像处理】实验二 图像变换

图像变换 一、实验内容&#xff1a; 1&#xff0e; 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2&#xff0e; 熟练掌握各种图像变换的基本原理及方法。 3&#xff0e; 能够从深刻理解图像变换&#xff0c;并能够思考拓展到一定的应用领域。…

Ubuntu 常用命令之 less 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 less命令是一个在Unix和Unix-like系统中用于查看文件内容的命令行工具。与more命令相比&#xff0c;less命令提供了更多的功能和灵活性&#xff0c;例如向前和向后滚动查看文件&#xff0c;搜索文本&#xff0c;查看长行等。 les…

Hive-基础介绍

文章目录 前言一、HiveQL介绍1. 概述2. 数据模型3. 数据定义语言&#xff08;DDL&#xff09;(1) 创建表(2) 创建分区表(3) 添加分区(4) 删除表 4. 数据操作语言&#xff08;DML&#xff09;(1) 插入数据(2) 查询数据(3) 更新数据(4) 删除数据 二、HiveQL函数1. 字符串函数1.1 …

ChatGPT一周年:开源语言大模型的冲击

自2022年末发布后&#xff0c;ChatGPT给人工智能的研究和商业领域带来了巨大变革。通过有监督微调和人类反馈的强化学习&#xff0c;模型可以回答人类问题&#xff0c;并在广泛的任务范围内遵循指令。在获得这一成功之后&#xff0c;人们对LLM的兴趣不断增加&#xff0c;新的LL…

R语言【base】——invisible将控制台的输出模式调整为隐藏,只允许赋值后输出,返回对象的(临时)不可见副本

Package base version 4.3.2 invisible(x NULL) 参数【x】&#xff1a;一个任意的 R 对象&#xff0c;默认为 NULL。 如果希望函数返回的值可以赋值&#xff0c;但在未赋值时不打印&#xff0c;则可以使用该函数。 f <- function(x){if (x){return (x)} else {return (in…

阿里云ECS配置IPv6后,如果无法访问该服务器上的网站,可检查如下配置

1、域名解析到这个IPv6地址,同一个子域名可以同时解析到IPv4和IPv6两个地址&#xff0c;这样就可以给网站配置ip4和ipv6双栈&#xff1b; 2、在安全组规则开通端口可访问&#xff0c;设定端口后注意授权对象要特殊设置“源:::/0” 3、到服务器nginx配置处&#xff0c;增加端口…

react v-18父组件调用子组件的方法和数据

版本 "react": "^18.1.0", "react-dom": "^18.1.0", 父组件 import React, { useState, useRef, memo, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Card } from &q…

Qt之QWidget 自定义倒计时器

简述 Qt提供的带进度显示的只有一个QProgresBar,这个控件要么是加载进度从0~100%,要么是持续的两边滚动;而我想要是倒计时的效果,所以QProgresBar并不满足要求,而Qt重写控件相对于MFC来说简直是轻而易举,所以就整了两种不同的倒计时控件; 效果 代码 QPushButton的绘制部…

2023 英特尔On技术创新大会直播 | AI魅力的生活化

目录 前言正文 前言 依稀记得去年的直播大会&#xff0c;主要展现了其灵活、加速和半集成化的独特优势&#xff0c;广泛应用于人工智能、5G通信、边缘计算以及视觉图像处理等领域&#xff0c;不断提供领先的性能、能效和可编程性的创新。 如今又带来一些不一样的特色&#xf…