qt中的qwidget如何实现自定义部件_2.3信号和槽(中)

2.3.1 在ui中编辑信号槽

这一小节我们来看一下如何在ui中编辑信号槽。

我们想要在ui中实现点击按钮,能够控制进度条的显隐。

新建GUI项目SignalsAndSlots2,类名SignalsAndSlots2,基类选择QWidget。打开ui文件。在编辑界面中拖入一个Progress Bar和一个PushButton

f296282831fb61b43731c8d0255c2d0d.png

在编辑窗口中工具栏中选择编辑信号槽(Edit Signals/Slots)或者直接按F4。

4ab98195ca1d01ae8c648a077b0a5fe0.png

点击需要发送信号的控件PushButton,并拖动箭头到需要接收信号的控件Progress Bar。

b1bbfdb37d195413596dea10ae24aa44.png

此时,会弹出连接窗口,勾选左下角“显示从QWidget中继承的信号和槽”,信号选择toggled(bool),槽选择setVisible(bool)。

2f87ab523b117b38615d6abde6ec6f9e.png

点击确定,如下图。

62390efbe45527bab678a6cbcc8eead5.png

再选择工具栏中的编辑窗口(Edit Widgets)或直接按F3,选择PushButton,修改按钮的checkable属性为true。checkable表示点击按钮后处于按下状态,若再点击按钮,才会弹起。checked为true,表示按钮已经被按下。

927aeb71b9054832811c4ab6bac48612.png

运行程序,弹起按钮,进度条隐藏,按下按钮,进度条显示。

此时,我们再打开生成的ui_signalsandslots2.h文件,看到下面这行代码:

QObject::connect(pushButton, SIGNAL(toggled(bool)),                  progressBar, SLOT(setVisible(bool)));

我们编辑的信号槽已经被写到这个头文件中了。

2.3.2 通过对象名关联信号槽

继续切回到ui界面,在pushButton上右击,选择“转到槽...”,在弹出的对话框中选择toggled(bool)。此时,在头文件和源文件中已经增加了on_pushButton_toggled()函数,在函数体中输入如下代码:

void SignalsAndSlots2::on_pushButton_toggled(bool checked){    if (checked)    {        ui->pushButton->setText("隐藏进度条");    }    else    {        ui->pushButton->setText("显示进度条");    }}

我们打开ui_signalsandslots2.h文件,发现又多了一行

QMetaObject::connectSlotsByName(SignalsAndSlots2);

由此,我们总结信号槽自动关联规则如下:

  1. 使用QObject::setObjectName()方法为对象设置名称。
  2. 调用QMetaObject::connectSlotsByName()启用自动关联。
  3. 用下划线"_"将"on",“对象名”,“信号名”连接后命名的函数,即:on_对象名_信号名(参数)

这样就可以实现信号槽的自动连接啦。

2.3.3 QSignalMapper

当我们想要点击一个按钮,并且想将预先定好的参数一同发送出去时,由于按钮的点击事件clicked()并没有参数,那么按照一般的做法就会先定义一个槽与clicked()信号关联,然后获取参数,再通过自定义的信号将该参数发送出去。

这个过程无疑是繁琐的,为此,Qt提供了QSignalMapper这个类来解决这个问题。同时,这个类可以连接多个按钮,匹配发送信号的对象对应的整数、字符串,窗口指针,继承于QObject的对象参数重新发送它们。

现在我们创建一个类似计算器的窗口。

新建GUI项目SignalMapperWidget,类名SignalMapperWidget,基类选择QWidget。在构造函数中添加如下代码

SignalMapperWidget::SignalMapperWidget(QWidget *parent) :    QWidget(parent),    ui(new Ui::SignalMapperWidget){    ui->setupUi(this);    //创建垂直布局,将垂直布局作为主布局    QVBoxLayout* vLayout = new QVBoxLayout(this);    //创建编辑框,用于显示点击按钮的文字,并且文字在右边显示    QLineEdit* edit = new QLineEdit;    edit->setAlignment(Qt::AlignRight);    vLayout->addWidget(edit);//将编辑框加入到垂直布局中    //创建信号匹配器    QSignalMapper* signalMapper = new QSignalMapper(this);    //创建0-9数字键,并都加入到网格布局中    QGridLayout *gridLayout = new QGridLayout;    for (int i = 0; i < 10; ++i)    {        QString txt = QString::number(i);        QPushButton *button = new QPushButton(txt);        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));        signalMapper->setMapping(button, txt);//将按钮和要发送的字符串配对        gridLayout->addWidget(button, i / 3, i % 3);//一行显示3列    }    //连接配对信号和设置文字槽    connect(signalMapper, SIGNAL(mapped(QString)),            edit, SLOT(setText(QString)));    vLayout->addLayout(gridLayout);    resize(200, 200);}

编译并运行。

1996a26c8c230faf7b75e4962d35db4b.png

2.3.4 相关函数

2.3.4.1 获取信号发送者

当多个信号连接一个槽时,有时需要判断是哪个对象发来的,那么可以调用sender()函数获取对象指针,返回为QObject指针。

QObject* sender() ;

2.3.4.2 解绑定信号槽

当我们不需要信号槽连接时,可使用disconnect()进行解绑定。其写法和connect一样,只需要将connect换成disconnect即可。

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

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

相关文章

html中 一条样式规则,css规则的基本格式是什么?

CSS(Cascading Styel Sheet)是控制 Web 页面外观的一系列格式设置规则,是网页设计必不可少的工具之一。下面我们就开始学习css的基本语法格式。css规则的基本格式是什么&#xff1f;层叠样式表是一个完全的纯文本文件&#xff0c;通常以“css”为扩展名作为单独的文件来使用…

css transtion不生效_CSS中transition属性不起作用的原因及解决方法

CSS中的transition属性可用于调整元素更改的时间&#xff0c;它可以像动画一样显示。虽然transition属性可以很方便的实现过渡效果&#xff0c;但是有时候可能会出现无效的情况&#xff0c;所以我们就需要来理解transition属性的写法规则。我们先来看一下CSS中transition属性不…

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序&#xff0c;这种方法&#xff0c;也被称为窄增量排序。因为DL&#xff0e;Shell至1959提出命名。该方法的基本思想是&#xff1a;先将整个待排元素序列切割成若干个子序列&#xff08;由相隔某个“增量”的元素组成的&#xff09;分别进行直接插入排序…

python清空列表_Python之列表

Python变量没有数据类型&#xff0c;所以Python没有数组。整数&#xff1b;浮点数&#xff1b;字符串&#xff1b;对象创建一个列表&#xff1a;1.member[大鱼,123,3.14,[1,2,3]]2.empty[]向列表添加元素&#xff1a;append&#xff08;&#xff09;&#xff1a;member[大鱼,12…

java切面1.6需要的包_Java技术 AspectJ

AspectJ1 简介AspectJ&#xff1a;Java社区里最完整最流行的AOP框架。在Spring2.0以上版本中&#xff0c;可以使用基于AspectJ注解或基于XML配置的AOP。2 在Spring中启用AspectJ注解支持导入JAR包springsource.net.sf.cglib-2.2.0.jarspringsource.org.aopalliance-1.0.0.jarsp…

华为什么时候更新鸿蒙os,华为鸿蒙系统升级时间表

华为鸿蒙系统升级时间表6月2日HUAWEI Mate 40 ProHUAWEI P40 ProHUAWEI Mate 40 ProHUAWEI Mate 30 ProHUAWEI Mate 40 RS保时捷设计HUAWEI Mate 30 Pro 5GHUAWEI Mate 40HUAWEI Mate 30E Pro 5GHUAWEI Mate 40EHUAWEI Mate 30 RS保时捷设计HUAWEI Mate 2HUAWEI Mate 30HUAWEI …

vsftpd安装问题汇总(持续更新。。)

问题1. 在执行make命令时却出现了问题&#xff0c;具体如下&#xff1a; sysdeputil.o: In function vsf_sysdep_check_auth: sysdeputil.c:(.text0x109): undefined reference to crypt sysdeputil.c:(.text0x13a): undefined reference to crypt collect2: ld 返回 1 make: *…

python游戏程序编码_python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)...

最近研究了下迷宫的生成算法&#xff0c;然后做了个简单的在线迷宫游戏。游戏地址和对应的开源项目地址可以通过上面的链接找到。开源项目中没有包含服务端的代码&#xff0c;因为服务端的代码实在太简单了。下面将简单的介绍下随机迷宫的生成算法。一旦理解后你会发现这个算法…

cesium等高线_Cesium专栏-气象站点色斑图、等值线图(不提供源码)

Cesium 是一款面向三维地球和地图的&#xff0c;世界级的JavaScript开源产品。它提供了基于JavaScript语言的开发包&#xff0c;方便用户快速搭建一款零插件的虚拟地球Web应用&#xff0c;并在性能&#xff0c;精度&#xff0c;渲染质量以及多平台&#xff0c;易用性上都有高质…

为什么OC语言很难

作为一个Objective-C的coder&#xff0c;我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来&#xff0c;但他们也总是联想到Objective-C看上去实在太难了或者在想这些语法符号都是神马玩意&#xff1f;不错&#xff0c;他们问得非常好…

小狐狸ChatGPT付费创作系统小程序端开发工具提示打开显示无法打开页面解决办法

最新版2.6.7版下载&#xff1a;https://download.csdn.net/download/mo3408/88656497 很多会员在上传小程序前端时经常出现首页无法打开的情况&#xff0c;错误提示无法打开该页面&#xff0c;不支持打开&#xff0c;这种问题其实就是权限问题&#xff0c;页面是通过调用web-v…

http status 404 – 未找到_从零开始搭建自己的网站004添加404处理页面

在将web-war上传到服务器并重启tomcat后&#xff0c;发现找不到login页面目录结构&#xff1a;add exception do wth page2.添加页面内容&#xff1b;到w404.jsp异常处理&#xff0c;404首页 Home (current) Link Dropdown Action Another action Disabled Search 百度百科&am…

dw怎么打开html模板,Dreamweaver中如何使用模板

随着Internet的普及&#xff0c;很多人已经不满足于仅仅上网冲浪&#xff0c;而希望深入地参与其中。现在&#xff0c;拥有自己的Web网站已经成为一种潮流。虽然制作一个简单的网页并不困难&#xff0c;但是制作出超凡脱俗的网站就不那么容易了。下面是小编为大家带来的关于Dre…

云计算的认识和看法_云存储已经成为存储的未来,你的存储跟上节奏了吗?

云计算是目前业界最关注的话题&#xff0c;其实云计算让很多人云里雾里。而云存储则是存储的未来。云存储这个概念的出现&#xff0c;在一定程度上改变了我们对于传统存储模式的看法。但是云存储想必让很多人迷惑&#xff0c;今天我们就来聊聊云存储的那些事儿。对于一些计算机…

coco2dx c++ HTTP实现

coco2dx c HTTP实现 达到的结果如下面的 iPhone截图 android 日志截图 流程图例如以下 功能主要通过CURL c pthread 实现 我实现的不是多线程断点&#xff08;假设要实现能够依据我这个进行加入任务序列&#xff0c;可參考 cocos2d-x 中AssetsManager的实现&#xff0c;事实上…

计算机动画 应用,计算机动画与应用.PDF

计算机动画与应用.PDF三维计算机动画金小刚Email: jin浙江大学CAD&CG 国家重点实验室紫金港校区蒙民伟楼512Course web: /home/jin/animation.htmXiaogang Jin 1 2/28/2017ModelingRenderingAnimation计算机图形 User Interface虚拟世界Xiaogang Jin 2 2/28/2017Pixar片头X…

idea怎么使用断点调试js_idea怎么使用断点调试js

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":10,"count":10}]},"card":[{"des":"刷脸门禁通行系统前端接入人脸AI赋能的人脸…

常量池在堆还是方法区_第九章_方法区

方法区栈、堆、方法区的交互关系这次所讲述的是运行时数据区的最后一个部分——方法区从线程共享与否的角度来看ThreadLocal&#xff1a;如何保证多个线程在并发环境下的安全性&#xff1f;典型应用就是数据库连接管理&#xff0c;以及会话管理栈、堆、方法区的交互关系下面就涉…

html5表单密码验证及提示,HTML5表单及其验证(示例代码)

1.输入型控件Input type用途说明email电子邮件地址文本框url网页URL文本框number数值的输入域属性 值 描述max number 规定允许的最大值min number 规定允许的最小值step number 规定合法的数字间隔(如果 step"3"&#xff0c;则合法的数是 -3,0,3,6 等)value number …

3.6.4python下载安装教程_python 3.6.4安装教程

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…