《QT学习之路2》笔记

5.自定义信号槽
之newspaper and reader:
程序如下,完全按照书编写只是稍稍改了一下使得能够显示读者名字。
---------------------------------------------------------
main.cpp
---------------------------------------------------------
#include <QCoreApplication>
#include "newspaper.h"
#include"reader.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Newspaper newspaper("Newspaper A");
    Reader reader("ChenShaoBo");
    QObject::connect(
    &newspaper,
    &Newspaper::newsPaper,
    &reader,
    &Reader::receiveNewspaper);

    newspaper.send();
    return a.exec();
}
----------------------------------------------------------------------

----------------------------------------------------------------------
newspaper.h
---------------------------------------------------------------------

#ifndef NEWSPAPER_H
#define NEWSPAPER_H
#include <QObject>
class Newspaper:public QObject
{
    Q_OBJECT
    public:
    Newspaper(const QString & name):m_name(name) {}

    void send()
    {
        emit newsPaper(m_name);
    }
    signals:
    void newsPaper(const QString &name);
    private:
        QString m_name;
};
#endif // NEWSPAPER_H
--------------------------------------------------------------------------------


---------------------------------------------------------------------------------
reader.h
-------------------------------------------------------------------------------------

#ifndef READER_H
#define READER_H
#include<QObject>
#include<QDebug>

class Reader:public QObject
{
    Q_OBJECT
    public:
    Reader(QString n): Rname(n) {}
    void receiveNewspaper(const QString &name)
    {
    qDebug()<<Rname<<"RECEIVES NWESPAPER:"<<name;
    }
    private:
    QString Rname; //添加读者名字Rname
};

#endif // READER_H
--------------------------------------------------------------------------------------------------
运行结果:

/home/csb/code/c++/qt/17/17 启动中...
"ChenShaoBo" RECEIVES NWESPAPER: "Newspaper A"


-------------------------------------------------------------------------------------
问题1:
关于Q_OBJECT:
通过对该字串的追踪,发现是一个宏定义:
#define Q_OBJECT \
public: \
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    struct QPrivateSignal {};
这是每一个QT中的对象都必需包含的成员吗???

问题2:emit newsPaper(m_name); //当对象改变其状态时,信号就由该对象发射 (emit) 出去,
也就是说emit就是自动触发发送signal的。
详细目录 1. 序 2. Qt 简介 3. Hello, world! 4. 信号槽 5. 自定义信号槽 6. Qt 模块简介 7. MainWindow 简介 8. 添加动作 9. 资源文件 10. 对象模型 11. 布局管理器 12. 菜单栏、工具栏和状态栏 13. 对话框简介 14. 对话框数据传递 15. 标准对话框 QMessageBox 16. 深入 Qt5 信号槽新语法 17. 文件对话框 18. 事件 19. 事件的接受与忽略 20. event() 21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. 贪吃蛇游戏(3) 34. 贪吃蛇游戏(4) 35. 文件 36. 二进制文件读写 37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. model/view 架构 42. QListWidget、QTreeWidget 和 QTableWidget 43. QStringListModel 44. QFileSystemModel 45. 模型 46. 视图和委托 47. 视图选择 48. QSortFilterProxyModel 49. 自定义只读模型 50. 自定义可编辑模型 51. 布尔表达式树模型 52. 使用拖放 53. 自定义拖放数据 54. 剪贴板 55. 数据库操作 56. 使用模型操作数据库 57. 可视化显示数据库数据 58. 编辑数据库外键 59. 使用流处理 XML 60. 使用 DOM 处理 XML 61. 使用 SAX 处理 XML 62. 保存 XML 63. 使用 QJson 处理 JSON 64. 使用 QJsonDocument 处理 JSON 65. 访问网络(1) 66. 访问网络(2) 67. 访问网络(3) 68. 访问网络(4) 69. 进程 70. 进程间通信 71. 线程简介 72. 线程和事件循环 73. Qt 线程相关类 74. 线程和 QObject 75. 线程总结 76. QML 和 QtQuick 2 77. QML 语法 78. QML 基本元素 79. QML 组件 80. 定位器 81. 元素布局 82. 输入元素 其他文章 宏定义中的 do {…} while (0) C++:在堆上创建对象,还是在栈上?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值