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”为扩展名作为单独的文件来使用…

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…

华为什么时候更新鸿蒙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 …

为什么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…

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

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

coco2dx c++ HTTP实现

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

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

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

html a 点击防止刷新,a标签点击跳转页面不刷新的问题

作为一位前端新手,刚接触移动端开发不久,遇到的问题真的是一个接着一个...前面写好了几个页面,今天试着将各个页面的链接打通,然后问题就来了...(╯︵╰)这里看一下原来想要实现的两个页面跳转的效果--点击图一标注的栏目可以跳转到一个新的页面图二...按照之前写a标签的跳转链…

不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案

摘要&#xff1a;针对传统的两线制表头在高低温环境下测量精度差、温漂大的特点&#xff0c;现提出一种可满足高低温环境使用需求的两线制高精度数显表头设计方案&#xff0c;此方案在高低温环境下测量精度高、工作稳定、抗干扰能力强。引言随着仪表技术和低功耗技术的发展&…

python gui开发_python 开发GUI应用之Dabo

这几天在研究用python开发GUI应用程序&#xff0c;首先选择了wxpython&#xff0c;英文书籍wxpython in action是不错的&#xff0c;网上也有中文版。 在win7下安装python2.7&#xff0c;wxpython2.8.12.1,来个HelloWorld&#xff0c;照着教程一点不成问题。 我为了能够快速开发…

计算机网络安装系统怎么办,电脑没有网络如何重装系统

大家应该在线重装系统的时候安装下载到一半会提示您没有网络了&#xff0c;需要用户怎么解决呢&#xff1f;无法联网可以重装系统吗&#xff1f;下面让小编带您了解一下无网环境下重装系统的教程操作哦&#xff01;1&#xff0c;在其他可联网的电脑上&#xff0c;使用小白一键重…

用计算机桁架各杆内力,运用AUTO CAD求解桁架内力?

摘要&#xff1a; 一个平面汇交力系的平衡条件是其力多边形必须闭合,依其条件,利用图解法和计算机中的AUTO CAD绘图工具,迅速准确地求解一个结点上的两个未知力,并以其类推求解桁架各杆内力。特别在复杂的桁架内力计算中更显示其法优越性。关键词&#xff1a; CAD 桁架 内力一般…

python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例

最近研究了Python的两个GUI包&#xff0c;Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下&#xff0c;我觉得PyQT使用起来更加方便&#xff0c;功能也相对丰富。这一篇用PyQT实现一个视频播放器&#xff0c;并借此来说明PyQT的基本用法。 视频播放器 先把已经完成…

数据库查找姓李的人_最通俗易懂的理解什么是数据库

1.什么是数据库呢&#xff1f;每个人家里都会有冰箱&#xff0c;冰箱是用来干什么的&#xff1f;冰箱是用来存放食物的地方。同样的&#xff0c;数据库是存放数据的地方。正是因为有了数据库后&#xff0c;我们可以直接查找数据。例如你每天使用余额宝查看自己的账户收益&#…

怎么在anaconda上安装python_我是如何用Anaconda来管理Python的

Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 Anaconda主要特点: 开源各个库之间的依赖性列出所需其他依赖包。多种开源库conda是包及其依赖项和环境的管理工具适用语言&#xff1a;P…

rdd分片 spark_Spark分区

一、分区的概念分区是RDD内部并行计算的一个计算单元&#xff0c;RDD的数据集在逻辑上被划分为多个分片&#xff0c;每一个分片称为分区&#xff0c;分区的格式决定了并行计算的粒度&#xff0c;而每个分区的数值计算都是在一个任务中进行的&#xff0c;因此任务的个数&#xf…

html5 防止脚本攻击,shell防ddos攻击脚本(二)

在上一篇shell防ddos攻击脚本(一)中,我给大家发了个脚本,那只是针对单机的,如果是在负载均衡下的话,很容易把自己的服务器ip给误封,所以这篇文章就给大家发个可以添加白名单的shell脚本.系统:centos 5.9 64位脚本内容:vi ip-dos-cc.sh#!/bin/bashnetstat -an| grep :80 |grep -…

python中配置opencv_在Windows中安装OpenCV-Python|四

目标 在本教程中&#xff0c;我们将学习在你的Windows系统中设置OpenCV-Python。 下面的步骤在装有Visual Studio 2010和Visual Studio 2012的Windows 7-64位计算机上进行了测试。屏幕截图展示的是VS2012。 从预编译的二进制文件安装OpenCV 下面的Python软件包将被下载并安装到…