当前位置: 首页 > news >正文

QT/自定义槽和信号

创建两个类student和teacher,父类都为QObject

在teacher中自定义Signal,hungry

//自定义信号,写道signals下
signals://返回值void//只需要声明//可以有参数,可以重载void hungry();void hungry(QString FoodName);

在student中自定义Slot,treat

//自定义槽函数,写到public slots Qt5.0版本以上可以写成全局函数或者public作用域下或者lambda表达式
public slots://返回值void//需要声明和实现//可以有参数,可以重载void treat();void treat(QString FoodName);

当teacher对象发出hungry信号,调用treat槽函数

connect(tc, &teacher::hungry, st, &student::treat);

当遇到重载的槽函数时,需用函数指针指向对应的函数

    //连接信号槽//连接有参数信号和槽//当信号和槽发生重载的时候,函数指针可以指向函数地址,用函数指针明确对应的函数void(teacher::*teacherSignal)(QString) = &teacher::hungry;void(student::*studentSlot)(QString) = &student::treat;void(student::*studentSlotEmpty)() = &student::treat;connect(tc, teacherSignal, st, studentSlot);connect(btn1, &QPushButton::clicked, st, studentSlotEmpty);

Qstring转换为char类型的方法

//QString转char* 通过.toUtf8转为QByteArrary类型通过.data()转为char*
qDebug() << "请老师吃" << FoodName.toUtf8().data();

student.h

#ifndef STUDENT_H
#define STUDENT_H#include <QObject>
#include <QDebug>class student : public QObject
{Q_OBJECT
public:explicit student(QObject *parent = nullptr);signals://自定义槽函数,写到public slots Qt5.0版本以上可以写成全局函数或者public作用域下或者lambda表达式
public slots://返回值void//需要声明和实现//可以有参数,可以重载void treat();void treat(QString FoodName);void treat(QString FoodName, QString SecondFoodName);
};#endif // STUDENT_H

teacher.h

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

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>
#include <QTextEdit>
#include "mypushbutton.h"
#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();teacher* tc;student* st;QPushButton* btn1;QPushButton* btn2;QPushButton* btn3;QPushButton* btn4;void display(QTextEdit *text1);void classIsOver();
private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//new时括号内加入this,会将对象放入对象树,会自动调用析构函数this->tc = new teacher(this);this->st = new student(this);this->btn1 = new QPushButton;this->btn2 = new QPushButton;this->btn3 = new QPushButton("close", this);this->btn4 = new QPushButton("吃两个菜", this);btn1->setParent(this);btn1->setText("下课");btn2->setParent(this);btn2->setText("display");btn2->move(0,200);btn3->move(0,300);btn4->move(0,250);//连接信号槽//连接有参数信号和槽//当信号和槽发生重载的时候,函数指针可以指向函数地址,用函数指针明确对应的函数void(teacher::*teacherSignal)(QString) = &teacher::hungry;void(student::*studentSlot)(QString) = &student::treat;connect(tc, teacherSignal, st, studentSlot);//信号可以连接信号void(teacher::*teacherSignalEmpty)() = &teacher::hungry;void(student::*studentSlotEmpty)() = &student::treat;connect(tc, teacherSignalEmpty, st, studentSlotEmpty);connect(btn1, &QPushButton::clicked, tc, teacherSignalEmpty);//信号可以断开连接//disconnect(btn1, &QPushButton::clicked, tc, teacherSignalEmpty);//一个信号可以绑定多个槽函数//多个信号可以绑定同一个槽函数connect(btn2, &QPushButton::clicked, tc, teacherSignalEmpty);//槽函数的参数和信号的参数类型必须一一对应//信号的参数个数可以多余槽函数的参数个数,反之不可以//链接槽函数 注:信号的参数要大于等于槽函数的参数,//点击事件无参,但是槽函数需要传递ui参数//故槽函数采用Qt5之后支持的lambda表达式进行传参,常用=传递值,而不是&,因为当槽和信号连接时,当前控件会进入锁的状态,而=传递是创造新的值覆盖,不会过多影响效率,加上mutable关键字,可以修改按值传递的拷贝//新建一个texteditQTextEdit *text1 = new QTextEdit(this);//设置大小为200*100并放置在(300,100)处text1->resize(200, 100);text1->move(300, 100);//重置窗体大小为600*400this->resize(600, 400);connect(btn2, &QPushButton::clicked, text1, [=](){display(text1);});//Qt4版本信号和槽信号写法(不推荐)//利用Qt4版本连接有参信号和槽//优势参数直观//劣势参数类型不做匹配检测//connect(tc, SIGNAL(hungry(QString), st, SLOT(treat(QString)));//点击按钮,关闭窗口connect(btn3, &QPushButton::clicked, this, [=](){this->close();});connect(btn4, &QPushButton::clicked, this, [=](){this->st->treat("宫保鸡丁", "鱼香肉丝");});classIsOver();
}void Widget::display(QTextEdit *text1)
{text1->setText("I Love you more than I can say!");text1->append("我爱你在心口难开");
}void Widget::classIsOver()
{//触发自定义信号,emit是Qt关键字,使用:在A中对B发出信号emit this->tc->hungry("宫保鸡丁");
}Widget::~Widget()
{delete ui;
}

相关文章:

  • Sentinel微服务流量治理组件实战上
  • SQL语法法则
  • Cover和contain属性
  • 算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)
  • 【0基础也能学会】JMeter:如何开始简单的WEB压力测试?
  • Vision Mamba:使用双向状态空间模型进行高效视觉表示学习
  • 微服务Day6
  • 5.22 BCC工具之deadlock.py解读
  • 相机选型介绍
  • WordPress后台自定义登录和管理页面插件Admin Customizer
  • 工厂设计模式总结
  • 【GameFramework框架内置模块】2、数据节点(Data Node)
  • 体验LobeChat搭建私人聊天应用
  • 编译遇到 AT_CHECK 未定义
  • 常用的消息中间件RabbitMQ
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • axios 和 cookie 的那些事
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HomeBrew常规使用教程
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript数组去重/查找/插入/删除
  • js对象的深浅拷贝
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 对象管理器(defineProperty)学习笔记
  • 看域名解析域名安全对SEO的影响
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何编写一个可升级的智能合约
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 白色的风信子
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)(3.5) 遥测无线电区域条例
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (黑马C++)L06 重载与继承
  • (利用IDEA+Maven)定制属于自己的jar包
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)nsfocus-绿盟科技笔试题目
  • ***测试-HTTP方法
  • .htaccess 强制https 单独排除某个目录
  • .NET 材料检测系统崩溃分析
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NetCore部署微服务(二)
  • .NET命名规范和开发约定
  • .sh
  • @requestBody写与不写的情况
  • [04] Android逐帧动画(一)