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

企业网站备案管理系统导航特效网站

企业网站备案管理系统,导航特效网站,陈锦良厦门建设局,wordpress有必要加论坛吗🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 1. 带参数的信号和槽1.2 参数匹配的信号和槽函数1.2 参数不匹配的信号和槽1.2.1 槽函数参数数量大于信号函数1.2.2 信号函数参数数量大于槽…

🏠个人主页:Yui_
🍑操作环境:Qt Creator
🚀所属专栏:Qt

文章目录

  • 1. 带参数的信号和槽
    • 1.2 参数匹配的信号和槽函数
    • 1.2 参数不匹配的信号和槽
      • 1.2.1 槽函数参数数量大于信号函数
      • 1.2.2 信号函数参数数量大于槽函数
      • 1.2.3 信号函数和槽函数的参数类型不同
  • 2.知识补充
    • 2.1 Q_OBJECT
    • 2.1 信号槽多对多
  • 3. 总结

在前面的文章中,我们已经了解了Qt自带的信号和槽函数以及自定义的信号和槽函数,但是这些都是没有带参数的,其实信号和槽函数是可以带有参数的。

1. 带参数的信号和槽

Qt的信号和槽也是支持带有参数的,同时也支持重载。
此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致。
当信号触发时,调用槽函数的时候,信号函数的实参就能被传递到槽函数的形参当中。

1.2 参数匹配的信号和槽函数

下面我回写一个程序,程序的功能是通过两个按钮来传递参数人窗口的标题发生改变。

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle(QString s)
{this->setWindowTitle(s);
}void Widget::on_pushButton_clicked()
{emit mySignal("被按钮1调用");
}void Widget::on_pushButton_2_clicked()
{emit mySignal("被按钮2调用");
}

头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
signals:void mySignal(QString s);
public slots:void handle(QString s);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

signal_3.gif

当信号函数和槽函数参数匹配时,并不会发生什么,那么现在让我们来看看参数不匹配的情况下是怎么样的吧。

1.2 参数不匹配的信号和槽

参数不匹配的情况可以分为三种:

  1. 槽函数的参数数量大于信号函数的参数数量但参数类型相同
  2. 信号函数的参数数量大于槽函数的参数数量但参数类型相同
  3. 信号函数和槽函数的参数数量相同但参数类型不同
    下面开始逐个讲解

1.2.1 槽函数参数数量大于信号函数

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle(QString s1,QString s2)
{this->setWindowTitle(s1);
}void Widget::on_pushButton_clicked()
{emit mySignal("被按钮1调用");
}void Widget::on_pushButton_2_clicked()
{emit mySignal("被按钮2调用");
}
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
signals:void mySignal(QString s1);
public slots:void handle(QString s1,QString s2);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H

image.png

可以看到,编译器报错了,这也就说明了槽函数参数数量大于信号函数是不可以的。

1.2.2 信号函数参数数量大于槽函数

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle(QString s)
{this->setWindowTitle(s);
}void Widget::on_pushButton_clicked()
{emit mySignal("被按钮1调用","");
}void Widget::on_pushButton_2_clicked()
{emit mySignal("被按钮2调用","");
}

image.png
可以正常运行,也就表明信号函数的参数个数超过槽函数的参数个数参数个数是可以正常使用的,但是反过来就是不行,槽函数的参数个数大于信号函数的参数个数,无法编译通过。
个数的不一致,槽函数就会按照参数的顺序拿到信号的前N个参数,确保槽函数的每个之都是有值。
思考下,为什么会这样呢?又为什么不要求参数的个数严格一致呢?
如果我们要求参数的个数完全一致,就意味着信号绑定到槽函数的要求变高了,换言之当下的规则允许信号和槽函数之间的绑定更加的灵活,更多的信号可以绑定到这个槽函数上了。

1.2.3 信号函数和槽函数的参数类型不同

会报错~
带有参数的信号要求信号的参数和槽函数的参数类型是一致的。

2.知识补充

2.1 Q_OBJECT

Qt中如果要让某个类能够使用信号槽,必须要在类最开始的地方,写下Q_OBJECT宏
使用ALT加右键点击
image.png
就可以看到里面的内容了,实际上这里还可以再进一步展开,最终会得到一系列很复杂的代码。

2.1 信号槽多对多

所谓的信号槽,终究要解决的问题就是响应用户的操作。
信号槽,其实在GUI开发的各种框架中是一个比较"有特色"的存在。
大部分的GUI开发框架都是一对一的存在
一个事件只能对应一个处理函数,一个处理函数也只能对应到一个事件上。
就比如网页开发中的JS,网页开发中响应用户操作,主要就是挂回调函数。
而Qt专门搞了一个单独的connect来完成信号槽的连接
Qt信号槽的设计,理想很美好,现实很骨感
该机制主要的效果就是:

  1. 解耦合,把触发用户操作的控件和处理对应用户的操作逻辑解耦合。
  2. 多对多的效果:一个信号可以connect到多个槽函数上,一个槽函数,也可以被多个信号connect。
    那么什么是多对多呢?
    以选课为例,一个学生可以选择多门课,一门课可以被多名学生选择这种。
    多对多真的实用吗?
    答案是否定的,在实际的开发过程中,随着大家的经验越来越多,其实在GUI开发的过程中,多对多就是一个伪需求,实际的开发中很少用到,绝大情况下一对一就够用了。
    所以一些新的图形化开发框架,很少有再继续支持这种多对多的了~

3. 总结

本文我们了解了带参数的信号和槽函数,得知了槽函数会接受到来自信号的参数。且这个参数也是有要求的,信号函数的参数个数可以大于槽函数的参数个数,但是类型必须相同。


文章转载自:

http://OwNN14oN.jcfdk.cn
http://jtBcZd8j.jcfdk.cn
http://qylcJfVZ.jcfdk.cn
http://NHXNnalu.jcfdk.cn
http://NezliOmD.jcfdk.cn
http://Xc66a2OP.jcfdk.cn
http://RHZCwLP9.jcfdk.cn
http://kkTKhMIU.jcfdk.cn
http://1prr6BtL.jcfdk.cn
http://4M5zVkHE.jcfdk.cn
http://qGJb6Ofi.jcfdk.cn
http://a0wYMyWQ.jcfdk.cn
http://iEZ6Eqnp.jcfdk.cn
http://xuw6vAK2.jcfdk.cn
http://tTBpmU8t.jcfdk.cn
http://SvEeuc2h.jcfdk.cn
http://CoeSgoUc.jcfdk.cn
http://N4BvkzkQ.jcfdk.cn
http://7pxLoVdn.jcfdk.cn
http://em72RXbM.jcfdk.cn
http://F0rnh161.jcfdk.cn
http://PMjfyElk.jcfdk.cn
http://Psm2glCn.jcfdk.cn
http://qnxqp0LA.jcfdk.cn
http://nJtZPpqn.jcfdk.cn
http://g6t0nEfZ.jcfdk.cn
http://scQ2tp5A.jcfdk.cn
http://inZwxgWi.jcfdk.cn
http://CrAJboC0.jcfdk.cn
http://MH1jqGUL.jcfdk.cn
http://www.dtcms.com/wzjs/717793.html

相关文章:

  • 外国人做中国英语视频网站模板网站建设咨询
  • 萝岗做网站无锡宜兴网站建设
  • 系统下载 网站 源码从化在哪里建设网站的
  • 福州市晋安区建设局网站西安优秀的集团门户网站建设公司
  • 网站技建设费计入什么科目做视频网站视频放在哪里找
  • 盘龙网站建设公司移动端网站开发尺寸
  • 企业网站建设服务哪家好怎么设置网页版浏览器
  • 做商标网站湖南众诚建设网站
  • 广州手表网站网站服务费做管理费用
  • 网站引导页是什么意思重庆网站自己推广
  • 职业学校网站模板做外贸的网站简称为什么网站
  • wordpress站点大全酒托做哪个网站好
  • 动物网站建设策划书网站开发的客户群体
  • 网站建设公司-跨界鱼科技优网站建设售后服务承诺函
  • 手机销售网站建设项目书wordpress 每页文章数量
  • 股票配资系统网站开发鞍山玉佛苑大佛
  • 淄博网站建设常见问题圆通我做网站拉
  • 为什么自己做的网站uc打不开小米公司网站前建设分析
  • 建设网站需要多少时间网页编辑按键
  • 上海哪里网站备案苏州城乡建设局的网站
  • 网站建设与管理教学视频下载我们公司想做网络推广
  • 高端商城网站建设网页设计师的能力
  • 建站的步骤有哪些手机网站制作大约多少钱
  • 买奢侈品去哪个网站有正品商标图案大全
  • 广州网站二级等保织梦如何做二级网站
  • php做音乐网站做网站前端
  • 怎么做一个网站平台深圳做微信网站
  • 网站seo服务公司网站开发完成情况说明
  • 上海建设工程安全质量监督总站网站郑州免费网站建设
  • 常州网站制作培训重庆业务外包网站建设