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

Qt桌面应用开发 第二天(信号和槽 Lambda表达式)

目录

1.信号和槽

1.1信号

1.2信号和槽重载问题

1.3 注意事项

1.4信号和槽Lambda表达式


1.信号和槽

信号的发送者——信号——信号的接受者——信号的处理(槽函数)

connect(信号的发送者,发送的信号,信号的接受者,处理的槽函数)

//点击按钮-窗口关闭
MyPushButton* myBtn=new MyPushButton;
myBtn->setParent(this);
myBtn->setText("zjx的按钮");
connect(myBtn,&QPushButton::clicked,this,&QWidget::close);

1.1信号

  • 自定义信号要写在signals下
  • 返回值必须是void
  • 信号只需声明,无需实现
  • 可以有参数,可以发生函数重载

1.2信号和槽重载问题

利用函数指针明确指向函数的入口地址。

void (Teacher:: *teSignal)(QString)=&Teacher::hungry;
void (student:: *stSlot)(QString)=&student::treat;

举例:老师饿了,学生请吃饭

发信号的对象:老师
信号:饿了
接收信号的对象:学生
槽函数:请吃饭
class student:public QObject
{
    Q_OBJECT
public:
    explicit student(QObject* parent=nullptr);

public slots:
    void treat();
    void treat(QString foodName);
};

void student::treat()
{
    qDebug()<<"学生请老师吃饭";
}

void student::treat(QString foodName)
{
    qDebug()<<"学生请老师吃"<<foodName;
}
class Teacher:public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject* parent=nullptr);

signals:
    void hungry();
    void hungry(QString foodName);
};
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //创建本页面上的对象
    this->st=new student(this);
    this->te=new Teacher(this);

    //利用函数指针明确指向函数的入口地址
    void (Teacher:: *teSignal)(QString)=&Teacher::hungry;
    void (student:: *stSlot)(QString)=&student::treat;

    //connect(this->te,&Teacher::hungry,this->st,&student::treat);
    connect(this->te,teSignal,this->st,stSlot);
    this->classOver();
}

小提示:QString转char*

QString输出时字符会带双引号,转为char*会去掉双引号(先转为QByteArray类型,再转为char*)

QString foodName;
foodname.toUtf8().data();//先转为QByteArray类型,再转为char*

1.3 注意事项

  • 多个信号可以连接同一个槽函数
  • 一个信号可以连接多个槽函数
  • 信号和槽的参数类型,必须一一对应
  • 信号和槽参数个数可以不同,但信号的参数个数必须大于等于槽函数参数个数

1.4信号和槽Lambda表达式

语法如下:

[捕获列表](参数)mutable ->return type;
{
    statement
}

捕获列表,标识一个lambda的开始
参数是函数的参数列表
->return type标识函数返回值的类型
mutable可修改标识符,可省略

捕获列表的形式如下:

mutable关键字:可以修改按值传递的拷贝


http://www.kler.cn/a/382787.html

相关文章:

  • C语言例题练手(1)
  • PCL 点云配准 精度评价指标均方根误差(RMSE)
  • 10大软件使用感受分享,数据恢复的得力助手!!
  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • 第二十九章 Vue之插槽
  • Vue中使用echarts生成地图步骤详解
  • 中级图像处理工具
  • web——warmup——攻防世界
  • csrf令牌
  • 计算机视觉读书系列(1)——基本知识与深度学习基础
  • 【计算机网络】TCP协议面试常考(一)
  • 2024 Web3.0创新大赛在沪正式启动
  • 微服务之间的信息传递---OpenFeign拦截器
  • [OS] Prerequisite Knowledge about xv6
  • 【LeetCode】【算法】155. 最小栈
  • 常用查找算法count_if
  • 基于JavaWeb的宿舍管理系统的设计与实现
  • 【游戏引擎之路】登神长阶(十二)——DirectX11教程:If you‘re going through hell, keep going!
  • 英伟达的cuda和人工智能快车
  • ubuntu 22.04 server 安装 anaconda3
  • 【Zynq FPGA】基于 Zynq FPGA 的雷龙 SD NAND 测试
  • Java 8 Lambda 表达式和函数式接口的底层实现机制详解
  • 【Linux】【守护进程】总结整理
  • 【AI开源项目】FastGPT - 快速部署FastGPT以及使用知识库的两种方式!
  • hive表内外表之间切换
  • Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败