Qt QObject::connect有趣的重载形式

举报
Amrf 发表于 2022/08/29 17:16:42 2022/08/29
【摘要】 Qt QObject::connect有趣的重载形式一般可以这么写QLabel *label = new QLabel;QScrollBar *scrollBar = new QScrollBar;QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));还可以这么写QObject::...

Qt QObject::connect有趣的重载形式

  • 一般可以这么写
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label,  SLOT(setNum(int)));
  • 还可以这么写
QObject::connect(scrollBar, &QScrollBar::valueChanged, label, &QLabel::setNum);

都知道SIGNAL、SLOT是两个宏,一直没注意两种形式的重载函数的差异,直到有一天需要从动态库里添加对已有的信号新增槽函数连接,
没有发送者的类型声明只有基类指针,这时候怎么连接呢,这时候翻看connect重载的时候发现原来

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

Q_CORE_EXPORT const char *qFlagLocation(const char *method);
#ifndef QT_NO_DEBUG
# define QLOCATION "\0" __FILE__ ":" QTOSTRING(__LINE__)
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
#else
# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a
#endif

所以我们可以写出下面这种看起来怪怪的代码

connect(pMain, "2testFinishSignal(bool)", this,SLOT(testFinish(bool)));

有趣

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。