Qt学习之旅 -信号与槽

news/2024/10/22 10:34:33/

文章目录

      • 点击关闭窗口
      • 自定义信号和槽
      • 自定义信号和槽解决重载问题
      • 信号和连接信号
      • 断开连接
      • Qt4版本信号槽连接
      • Lambda表达式

点击关闭窗口

connect(信号发送者,发送的具体信号,信号接收者,型号的处理(槽slot));

这里自定义的MyPushButtonQPushButton别无二至

Widget::Widget(QWidget *parent): QWidget(parent)
{resize(600,400);setWindowTitle("第一个窗口");setFixedSize(600,400);//创建一个按钮MyPushButton *myBtn = new MyPushButton;myBtn->setText("我自己的按钮");myBtn->setParent(this);myBtn->move(0,20);//需求: 点击我的按钮 关闭窗口connect(myBtn,&QPushButton::clicked, this,&Widget::close);
}

自定义信号和槽

在这里插入图片描述

//teacher.h
#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();public slots:
};#endif // TEACHER_H
//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://早期Qt版本 必须要写到public slots,高级版本可以写到public或者全局下//返回值void,需要声明,也需要实现//可以有参数,可以发生重载void treat(); //申明
};#endif // STUDENT_H
#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 "teacher.h"
#include "student.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;Teacher *zt;Student *stu;void classIsOver();
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//老师触发一个信号:饿了;学生响应信号:请客吃饭connect(zt,&Teacher::hungry,stu,&Student::treat);//调用下课函数classIsOver();
}void Widget::classIsOver(){//触发信号emit zt->hungry();
}Widget::~Widget()
{delete ui;
}

自定义信号和槽解决重载问题

//teacher.h
#ifndef TEACHER_H
#define TEACHER_H#include <QObject>class Teacher : public QObject
{Q_OBJECT
public:explicit Teacher(QObject *parent = nullptr);signals:void hungry();void hungry(QString foodName); //添加public slots:
};#endif // TEACHER_H
//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 foodName); //添加
};#endif // STUDENT_H
//student.cpp(实现)
#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{}void Student::treat(){qDebug() << "请老师吃饭";
}void Student::treat(QString foodName){qDebug() << "请老师吃饭,老师要吃" << foodName;
}
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//连接带参数的信号和槽//指针 -> 地址//函数指针 -> 函数地址void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个connect(zt,teacherSignal,stu,studentSlot);//调用下课函数classIsOver();
}
void Widget::classIsOver(){//触发信号emit zt->hungry("红烧牛肉");
}Widget::~Widget()
{delete ui;
}

需要通过函数指针告诉它找哪块函数定义(有参还是无参)

在这里插入图片描述
这里不是有""引起了要吃的东西(就是"红烧牛肉")

//Student.cpp
void Student::treat(QString foodName){qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}

重点: 需要利用函数指针明确指向函数的地址void(类名:: *实例名)(QString/*形参*/) = 类名::重载函数名

  • QString转成char *
    • toUtf8()转为QByteArray;再使用data()转为char *

信号和连接信号

点击一个按钮触发自定义连接

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个老师对象this->zt = new Teacher(this);//创建一个学生对象this->stu = new Student(this);//连接带参数的信号和槽//指针 -> 地址//函数指针 -> 函数地址void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个connect(zt,teacherSignal,stu,studentSlot);//重置窗口大小this->resize(600,400);QPushButton *btn = new QPushButton("下课",this);//connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);connect(btn,&QPushButton::clicked,zt,teacherSignal);}

依旧是信号在调用槽函数

断开连接

//void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;//指向有参数的那个
//void(Student:: *studentSlot)(QString) = &Student::treat; //指向有参数的那个
//connect(zt,teacherSignal,stu,studentSlot);
disconnect(zt,teacherSignal,stu,studentSlot);//与连接参数一致

Qt4版本信号槽连接

connect(zt,SUGHAL(hungry),st,SLOT(treat()));

Lambda表达式

C++11中的Lambda表达式用于定义并创建匿名函数对象。以简化编程工作

在这里插入图片描述
格式

[](){}();
  • 空,没有使用任何函数对象参数。
  • =,函数体内可以使用Lambda所在作用域范围内所有的局部变量(包括Lambda所在的this)并且是引用传递方式(相当于编译器自动为我们按引用传递了所有的局部变量)
  • &,函数体内可以使用lambda所在作用返回内所有可见局部变量(包括lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)
  • this,函数体内可以使用lambda所在类中的成员变量
  • a,将a按值进行传递,按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数时const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  • &a,将a按引用进行传递。
  • a,&b:将a按值进行传递,b按引用进行传递
  • =,&a,&b出a和b按引用进行传递外,其他参数按照值进行传递
  • &,a,b出a和b按值传递外,其他参数都按引用进行传递。

http://www.ppmy.cn/news/258684.html

相关文章

RFID手持机助力仓储物流信息化管理

基于RFID手持机应用仓储物流管理&#xff1a;随着电子商务和物联网等领域的快速发展&#xff0c;传统的仓储管理模式已经满足不了现代的物流需求了。近些年推出的RFID手持机设备将很大程度上提高仓储物流管理水平&#xff0c;并且能够加快仓储物流管理的信息化建设。基于RFID技…

LORA智能巡检手持机|无线数据采集终端

企业进行生产经营的目的&#xff0c;就是获取最大的经济效益&#xff0c;企业的一切经营管理活动也是紧紧围绕着提高经济效益这个中心进行的&#xff0c;设备管理是提高经济效益的基础。在预防维修方式下&#xff0c;设备状态要素的提取不全面&#xff0c;往往会过多强调设备周…

GPS NAME0183 详解

NMEA协议是为了在不同的GPS导航设备中建立统一的RTCM(海事无线电技术委员会)标准&#xff0c;它最初是由美国国家海洋电子协会(NMEA—The NationalMarine Electronics Association)制定的。NMEA协议有0180、0182和0183这3种&#xff0c;0183可以认为是前两种的升级&#xff0c;…

android gps 获取方位_Android GPS定位 获取经纬度

Android GPS 定位 获取经纬度 移动 是手机与手持设备的最大特点&#xff0c; 可以通过 Eclipse 的 DDMS 视图&#xff0c; 模拟设备的位置变化&#xff0c; 改变经纬度后&#xff0c;点击 send &#xff0c;然后运行程序&#xff0c;在应用程序中&#xff0c;动态的获取设备位置…

gps测试软件用法,gps测量仪器使用方法及教程

GPS(Global PosiTIon System)是美国于1973年开始筹建的全球定位系统,1994年建成投入使用,可向全球提供实时的三维位置、速度和时间信息。本文将介绍GPS测量仪(手持机)的使用方法。 GPS测量原理 卫星定位法是利用地面站接收机接收某种导航卫星的信息,直接测定地面接收站的地心…

真实GPS坐标信息转百度地图坐标

第一次写博客&#xff0c;记录自己成长的过程。如有是错误的地方&#xff0c;请大家提出。 做了一个小的项目&#xff0c;遇到通过模块获得的真实的GPS信息&#xff0c;需要转换到百度地图上显示。后来在网上查阅&#xff0c; 真实标准坐标即我们获取到的坐标&#xff0c;真实坐…

GPS信号接收机的频偏和相位锁定matlab仿真

目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 全球定位系统(Global Positioning System,GPS),是一种以人造地球卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。GPS自问世以来,就…

多功能RFID手持机9171A

一、舜识物联网多功能手持机--基本参数 性能参数 型号 U9171A 操作系统 Android 9.0 处理器 八 核 Cortex-A53&#xff0c;1.4 GHz 内存 RAM&#xff1a;2GB ROM&#xff1a;16GB RAM&#xff1a;4GB ROM&#xff1a;64GB(选配) 扩展内存 Micro SD 卡&#xff0c;最大…