转载文章超哥的经验之谈---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. Vuex 基础

    其他章节请看: vue 快速入门 系列 Vuex 基础 Vuex 是 Vue.js 官方的状态管理器 在vue 的基础应用(上)一文中,我们已知道父子之间通信可以使用 props 和 $emit,而非 ...

  2. 攻防世界XCTF-WEB入门全通关

    为了更好的体验,请见我的---->个人博客 XCTF的web块入门区非常简单,适合一些刚接触安全或者对网络安全常识比较了解的同学在安全搞累之余娱乐娱乐. 其主要考察下面几点: 基本的PHP.Py ...

  3. css3鼠标悬停图片边框线条动画特效

    css3鼠标经过内容区时,边框线条特效效果制作.   html: <div class="strength grWidth hidden"> <div class ...

  4. python解释器和Pycharm编辑器安装使用完整详细教程

    一.官网下载或软件管家公众号下载 二.安装Python解释器 1.选择自定义安装并添加到环境变量 2.检验Python是否安装成功 三.安装pycharm编辑器 1.点击安装,修改安装路径,建议安装C ...

  5. [敏捷软工团队博客]Beta阶段发布声明

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段发布声明 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...

  6. Spring Cloud Gateway Route Predicate Factory 的使用

    Spring Cloud Gateway的使用 一.需求 二.基本组成 1.简介 2.核型概念 1.Route 路由 2.Predicate 谓语.断言 3.Filter 过滤器 3.工作原理 三.网 ...

  7. spring security整合QQ登录

    最近在了解第三方登录的内容,尝试对接了一下QQ登录,此次记录一下如何实现QQ登录的过程,在这个例子中是和spring secuirty整合的,不整合spring secuirty也是一样的. 需求: ...

  8. 2021.7.27考试总结[NOIP模拟25]

    罕见的改完了题 T1 random 一堆概率,一堆函数,一堆递归,一眼不可做, 但它只有一个参数,所以.. 熠神本着"只有20太难看"的心态,通过样例三个出规律,口胡了一波$\fr ...

  9. 单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序.如果是新手的话,建议边看中文手册和学习视频;如果是已经入门的,个人建议自己做一个项目,不论项目大小,当然里面会涉及到自己已经学习过的,或者是自己 ...

  10. hdu 1027 Ignatius and the Princess II(正、逆康托)

    题意: 给N和M. 输出1,2,...,N的第M大全排列. 思路: 将M逆康托,求出a1,a2,...aN. 看代码. 代码: int const MAXM=10000; int fac[15]; i ...