结合教程,写出如下关于信号槽的代码,将教程中信号槽两种方式写入同一个界面中。

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include <QPushButton>
  4. #include <QDebug>
  5. #include <QHBoxLayout>
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. QApplication a(argc, argv);
  10. //MainWindow w;
  11. //w.show();
  12.  
  13. QWidget *myWidget = new QWidget;
  14. myWidget->setWindowTitle("Hello World");
  15.  
  16. //信号槽
  17. QPushButton *button0 = new QPushButton;
  18. button0->setText("Quit");
  19. QObject::connect(button0, &QPushButton::clicked, &QApplication::quit);
  20. // Lambda表达式标准输出
  21. QPushButton *button = new QPushButton;
  22. button->setText("std::out");
  23. QObject::connect(button, &QPushButton::clicked, [](bool) {
  24. qDebug() << "You clicked me!";
  25. });
  26.  
  27. QHBoxLayout *layout = new QHBoxLayout;
  28. //layout->addItem(button0);
  29. layout->addWidget(button0);
  30. layout->addWidget(button);
  31. myWidget->setLayout(layout);
  32.  
  33. myWidget->show();
  34.  
  35. return a.exec();
  36. }

Qt5中信号槽的定义:

  1. QMetaObject::Connection connect(const QObject *, const char *,
  2. const QObject *, const char *,
  3. Qt::ConnectionType);
  4.  
  5. QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
  6. const QObject *, const QMetaMethod &,
  7. Qt::ConnectionType);
  8.  
  9. QMetaObject::Connection connect(const QObject *, const char *,
  10. const char *,
  11. Qt::ConnectionType) const;
  12.  
  13. QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
  14. const QObject *, PointerToMemberFunction,
  15. Qt::ConnectionType)
  16.  
  17. QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
  18. Functor);

connect()一般会使用前面四个参数,第一个是发出信号的对象,第二个是发送对象发出的信号,第三个是接收信号的对象,第四个是接收对象在接收到信号之后所需要调用的函数。也就是说,当 sender 发出了 signal 信号之后,会自动调用 receiver 的 slot 函数。

  1. connect(sender, signal, receiver, slot);

自定义信号槽:

  1. //newspaper.h
  2.  
  3. #ifndef NEWSPAPER_H
  4. #define NEWSPAPER_H
  5.  
  6. #include <QObject>
  7.  
  8. //使用信号槽必须继承QBject类
  9. class Newspaper : public QObject
  10. {
  11. //QBject类及其子类,都必须在第一行写Q_OBJECT
  12. //该宏应放于头文件中
  13. Q_OBJECT
  14. public:
  15. Newspaper(const QString & name) :
  16. m_name(name)
  17. {
  18. }
  19.  
  20. void send()
  21. {
  22. //emit 的含义是发出newPaper()的信号
  23. emit newPaper(m_name);
  24. }
  25.  
  26. //信号函数,返回值为void,参数是类要让外界获取的数据
  27. signals:
  28. void newPaper(const QString &name);
  29.  
  30. private:
  31. QString m_name;
  32. };
  33. #endif // NEWSPAPER_H
  1. //reader.h
  2.  
  3. #ifndef READER_H
  4. #define READER_H
  5.  
  6. #include <QObject>
  7. #include <QDebug>
  8.  
  9. class Reader : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. Reader() {}
  14.  
  15. //槽函数
  16. void receiveNewspaper(const QString & name)
  17. {
  18. qDebug() << "Receives Newspaper: " << name;
  19. }
  20. };
  21.  
  22. #endif // READER_H
  1. #include "mainwindow.h"
  2. #include "newspaper.h"
  3. #include "reader.h"
  4. #include <QApplication>
  5. #include <QPushButton>
  6. #include <QDebug>
  7. #include <QHBoxLayout>
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11.  
  12. QCoreApplication app(argc, argv);
  13. //MainWindow w;
  14. //w.show();
  15.  
  16. Newspaper newspaper("Newspaper A");
  17. Reader reader;
  18. //信号连接机制
  19. QObject::connect(&newspaper, &Newspaper::newPaper,
  20. &reader, &Reader::receiveNewspaper);
  21. newspaper.send();
  22.  
  23. return app.exec();
  24.  
  25. }

编译文件,报错——LNK2001,无法链接解析的外部符号。

解决方法:将Project的同级编辑文件删除,重新编译既可。

输出:

QT——信号槽的更多相关文章

  1. Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  2. QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类

    一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...

  3. QT信号槽详解

    1         QT信号槽详解 1.1  信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...

  4. Qt信号槽的一些事 Qt::带返回值的信号发射方式

    一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...

  5. Qt信号槽的一些事

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  6. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  7. Qt信号槽-原理分析

    目录 一.问题 二.Moc 1.变量 2.Q_OBJECT展开后的函数声明 3.自定义信号 三.connect 四.信号触发 1.直连 2.队列连接 五.总结 六.推荐阅读 一.问题 学习Qt有一段时 ...

  8. Qt信号槽源码剖析(一)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...

  9. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  10. (文字版)Qt信号槽源码剖析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...

随机推荐

  1. 【总结】牛客职播第九期:您的美团点评offer已送到门口,快来与我们一起影响世界!

    一.介绍 美团点评2018校园春招流程介绍&面试答疑 讲师:燕鹏.Taylor 二.收获 面试时如果太紧张或者内向,容易吃亏,所以建议把面试当做展示自己的一次舞台. 遇见一道编程题目,如果无法 ...

  2. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  3. vi 命令集

    一:跳到文件第一行 1. 输入:0或:1,然后回车: 2. 在键盘按下小写gg:   二:跳到文件最后一行 1. 输入:$,然后回车: 2. 在键盘按下大写G : 3. 在键盘按Shift + g: ...

  4. JavaScript数据去掉空值

    js数组中过滤掉false, null, 0, "", undefined, and NaN值的方法 对于 false,null,0,undefiend,NaN直接取!得到的都是t ...

  5. 成都传智播客java就业班(14.04.01班)就业快报(Java程序猿薪资一目了然)

    这是成都传智播客Java就业班的就业情况,很多其它详情请见成都传智播客官网:http://cd.itcast.cn?140812ls 姓名 入职公司 入职薪资(¥) 方同学 安**软件成都有限公司(J ...

  6. springboot+shiro+redis(单机redis版)整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(集群redis版)整合教程 3.springboot+shiro+redis(单机red ...

  7. Windows 7运行命令大全

    Windows 7运行命令大全,小编整理了常用的45个Win7运行命令分享给大家:1.cleanmgr:打开磁盘清理工具 2.compmgmt.msc:计算机管理 3.conf:启动系统配置实用程序 ...

  8. [转]Apache 监听端口失败,selinux惹的祸

    原文在此 CentOS 下启动Httpd 失败,报 (13)Permission denied: make_sock: could not bind to address [::]:8000 因为 小 ...

  9. Thinkphp5笔记一:项目部署

    系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 笔记分为两大部分,配置篇与数据库篇 一.虚拟主机部署/本地部署 在网站根目录下建立文件index.ph ...

  10. EasyUI的功能树之扁平化

    上篇博客主要介绍了异步加载树的方法,通过前台传给后台一个节点的id值,然后当单击节点加号时,查询并显示其子节点的数据.其实如果不是很大的数据,我们本可以次把树中所有节点都加载上来的.也就是说,我的Ac ...