转载文章超哥的经验之谈---Qt5 connect使用之“重载信号和槽”

Qt4中,关联信号与槽是要使用到SIGNAL()SLOT()这两个宏。

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int)));

但是Qt5中更改了写法

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);

上面两种写法都是没有任何问题,都可以实现关联信号和槽。

Qt4中,因为是会制定信号和槽的参数类型,所以就不会发生不知道调用哪个槽或者信号的问题,但是在Qt5中,如果你遇到了重载的信号或者是槽,该如何指定想要调用的信号或者槽呢?

比如QComboBox这个类,这是别人举例的这个,我写下这个的时候,这个类的信号没有这个重载了。

这是之前的:

void QComboBox::currentIndexChanged(const QString &text)

void QComboBox::currentIndexChanged(int index)

Qt5.15.2的时候已经改变了,我个人觉得,这个可能是官方有意避免这种重载的写法。

QComboBox Class : Signals

void activated(int index)
void currentIndexChanged(int index)
void currentTextChanged(const QString &text)
void editTextChanged(const QString &text)
void highlighted(int index)
void textActivated(const QString &text)
void textHighlighted(const QString &text)

QComboBox::currentIndexChanged 信号有以上两种重载, 分别参数为字符串类型和整型。

下面以字符串类型参数为例:

auto *comboBox = new QComboBox;
auto *label = new QLabel; // ① 基于字符串匹配 connect
connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
label, SLOT(setText(const QString&))); // ② 基于方法地址匹配 connect. 使用 static_cast 实现
connect(comboBox,
static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
label, &QLabel::setText); // ③ 基于方法地址匹配 connect, 使用 方法地址 实现
void(QComboBox::*curChangeSiganl)(const QString&) = &QComboBox::currentIndexChanged;
connect(comboBox, curChangeSiganl, label, &QLabel::setText);

除了以上三种实现方式, Qt 也有自己的实现方式: qOverload

// ④ 基于方法地址匹配 connect, 使用 QOverload 实现
connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
label, &QLabel::setText); // ⑤ 基于方法地址匹配 connect, 使用 qOverload 实现. 需要 支持 C++14
connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
label, &QLabel::setText);

qOverload

上面的案例 ④⑤ 是qOverload的基础语法使用。

qOverload 的作用是返回重载函数的指针,模板参数为函数类型列表

struct Foo {
void overloadedFunction();
void overloadedFunction(int, const QString &);
void overloadedFunction(int, const QString &) const;
};
... qOverload<>(&Foo::overloadedFunction)
... qOverload<int, const QString &>(&Foo::overloadedFunction)

针对const 重载, 可以使用**qConstOverloadqNonConstOverload**

... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)

qOverload 需要 C++14 支持. 针对 C++11, 可以使用 QOverloadQConstOverloadQNonConstOverload 辅助类

... QOverload<>::of(&Foo::overloadedFunction)
... QOverload<int, const QString &>::of(&Foo::overloadedFunction) ... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)

Qt5 connect 重载信号和槽的更多相关文章

  1. Qt5教程: (2) 信号与槽

    1. 新建工程 新建一个"Qt Widgets Application"工程 2. 添加按钮 一个Qt工程会有很多个控件, 如果把逻辑代码都写在main函数里, main函数会非常 ...

  2. QT5中的信号与槽与C++ 11的function的配合

    最近将公司的界面开发库从WX转换到了QT,有了信号和槽,原本我们在使用WX的时候,为了使用信号,我们是使用BOOST的signal2库,到了QT有了信号槽,这个就没什么必要了 但是前段时间使用QT发现 ...

  3. QT5:第八章 信号与槽机制

    一.简介 QT编程中信号与槽用于处理界面各个组件的交互,类似与MFC的消息循环和绑定 注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT 信号(Signal)就是在特定情况下被发射 ...

  4. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  5. QT 信号与槽connect

    QT 信号与槽connect QT 信号与槽connect connect函数调用几个限制 connect函数代码 QT中信号与槽的连接使用的connect函数是一个静态函数,在类QObject中定义 ...

  6. QT信号和槽函数学习笔记

    //connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...

  7. 6.QT信号和槽

     新建项目SignalAndSlot项目 编写代码如下: mysignal.h #ifndef MYSIGNAL_H #define MYSIGNAL_H   #include <QObje ...

  8. Qt信号与槽使用方法最完整总结

    在图形界面编程中(参考<C++最好的图形库是什么?>),组件之间如何实现通信是核心的技术内容.Qt 使用了信号与槽的机制,非常的高效.简单.易学,方便开发者的使用.本文详细的介绍了Qt 当 ...

  9. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

随机推荐

  1. python在指定一行的下一行插入文本

    给定一个程序,程序中有许多函数,比如,funcA,funcB,现在,如何在生成的函数中插入一个logger()语句? 这里用一个solidity程序做例子 pragma solidity ^0.4.0 ...

  2. Bug概述、状态、类型、级别、优先级提交和Bug生命周期管理

    缺陷概述: 1)缺陷(Defect):是指存在于软件之中偏差,可被激活,以静态形式存在于软件内部,相当于Bug. 2)故障(Fault):当缺陷被激活后,软件运⾏中出现的状态,可引起意外情况,若不加处 ...

  3. UI自动化测试之Airtest

    官方文档: https://airtest.doc.io.netease.com/ 本文我们讲解下Airtest的使用,主要学习目标有以下几点: (1)认识Airtest (2)了解Airtest能做 ...

  4. 正则表达式: NFA引擎匹配原理

    NFA引擎匹配原理 1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...

  5. 第四次Alpha Scrum Meeting

    本次会议为Alpha阶段第四次Scrum Meeting会议 会议概要 会议时间:2021年4月28日 会议地点:线上会议 会议时长:18min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...

  6. SpringCloud 2020.0.4 系列之服务降级

    1. 概述 老话说的好:做人要正直,做事要正派,胸怀坦荡.光明磊落,才会赢得他人的信赖与尊敬. 言归正传,之前聊了服务间通信的组件 Feign,今天我们来聊聊服务降级. 服务降级简单的理解就是给一个备 ...

  7. Noip模拟8 2021.6.17

    T1 星际旅行 仔细一看,发现像一个欧拉路(简称一笔画). 满足"可以一笔画"的条件是: 1.所有点都有偶数条连边; 2.有偶数个点连奇数条边; 满足以上两个条件的任意一个即可一笔 ...

  8. 确定两串乱序同构 牛客网 程序员面试金典 C++ Python

    确定两串乱序同构 牛客网 程序员面试金典 C++ Python 题目描述 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串.这里规定大小写为不同字符,且考虑字符串中 ...

  9. Jenkins file一行代码部署.NET程序到K8S

    什么是Jenkins共享库 随着微服务的增多,每个项目的都需要pipline文件,这样的话Pipeline代码冗余度高,并且pipeline的功能越来越复杂. jenkins可以使用Shared Li ...

  10. 低代码开发,推荐一款Web 端自动化神器:Automa

    1. Automa介绍 又到了优秀工具推荐的时候了,今天给大家分享一款前端自动化操作神器: Automa . 首先了解一下Automa是什么? Automa它定位是一款 Chrome 插件,也就意味着 ...