2.3.1 在ui中编辑信号槽

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

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

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

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

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

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

点击确定,如下图。

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

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

此时,我们再打开生成的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);}

编译并运行。

2.3.4 相关函数

2.3.4.1 获取信号发送者

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

QObject* sender() ;

2.3.4.2 解绑定信号槽

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

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

  1. Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现)

    Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现) 目录 matplotlib库中利用legend函数创建自定义图例 原始图像 在原始图像上创建自定义 ...

  2. 如何在谷歌地图自定义范围_如何在Google表格中更改和创建自定义数字格式

    如何在谷歌地图自定义范围 Khamosh Pathak Khamosh Pathak By default, Google Sheets doesn't format numbers. If you' ...

  3. [Qt教程] 第44篇 进阶(四)信号和槽

    [Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...

  4. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  5. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  6. Qt Designer信号和槽

    2019独角兽企业重金招聘Python工程师标准>>> 先入一些信号槽的基本介绍: 信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包 ...

  7. 【qt】QT 的信号与槽机制

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  8. 【转载】QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  9. QT核心机制3:信号与槽

    个人博客对应地址:QT核心机制3:信号与槽 写在前面 这篇文章基本是对Qt官方文档某些章节的翻译理解了,翻译这些章节的原因是我认为这些是Qt中最核心的东西,翻译的过程也就是强迫自己认真去读它们的过程, ...

最新文章

  1. 详细设计说明书读后感_专利申请详细步骤是怎样的,要多久时间
  2. python(numpy,pandas11)——pandas merge根据索引合并数据
  3. MFC启动和关闭线程
  4. 大学期末c语言作业演示,大学C语言期末考试练习题(带详解答案)
  5. 前端学习(1899)vue之电商管理系统电商系统之渲染添加用户的表单
  6. java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
  7. php内置常量显示行数,php学习记录-系统内置常量(constant)
  8. 设计模式笔记十二:享元模式 | 更新版
  9. 人工智能(10)---机器学习知识体系篇(初级篇,中级篇,高级篇)
  10. ubunt18 mysql_Ubuntu18.04下安装MySQL教程
  11. 毕业设计 基于大数据的社交平台数据爬虫舆情分析可视化系统
  12. MATLAB加入螺旋相位板调制,螺旋相位板原理及使用手册
  13. Idea不识别Java项目
  14. amend用法 git 信息_Git commit --amend 修改提交信息操作
  15. php根据手机号码获取归属地,PHP通过API获取手机号码归属地
  16. 【python numpy库的使用】向量的加减法
  17. 关于js 中 try catch用法
  18. 南华大学2022第五届网络安全竞赛wp
  19. windows7安装打印机提示“本地打印后台处理程序服务没有运行”
  20. [预训练语言模型专题] MT-DNN(KD) : 预训练、多任务、知识蒸馏的结合

热门文章

  1. js正则表达式匹配span标签
  2. 从底层重学 Java 之两大浮点类型 GitChat连接
  3. java enumerator_NSEnumerator使用
  4. sqlserver note
  5. Fashion-MNIST数据集离线加载办法
  6. oracle 10g dsg,【ORACLE】relink oracle 10g 数据库
  7. oracle查看列状态unused,Oracle9i下将列设为UNUSED时的系统行为
  8. c# winform窗体如何设置才可以不能随意拖动大小
  9. 在centOS7.2里安装virtualenv和flask
  10. 用Spark学习FP Tree算法和PrefixSpan算法