zoukankan      html  css  js  c++  java
  • QT. 学习之路 二

      Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。

      举报纸和订阅者的例子:有一个报纸类 Newspaper,有一个订阅者类 Subscriber。Subscriber 可以订阅 Newspaper。这样,当 Newspaper 有了新的内容的时候,Subscriber 可以立即得到通知。在这个例子中,观察者是 Subscriber,被观察者是 Newspaper。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如 subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。

    //!!! Qt5
    #include <QObject>
     
    ////////// newspaper.h
    class Newspaper : public QObject
    {
        Q_OBJECT
    public:
        Newspaper(const QString & name) :
            m_name(name)
        {
        }
     
        void send()
        {
            emit newPaper(m_name);
        }
     
    signals:
        void newPaper(const QString &name);
     
    private:
        QString m_name;
    };
     
    ////////// reader.h
    #include <QObject>
    #include <QDebug>
     
    class Reader : public QObject
    {
        Q_OBJECT
    public:
        Reader() {}
     
        void receiveNewspaper(const QString & name)
        {
            qDebug() << "Receives Newspaper: " << name;
        }
    };
     
    ////////// main.cpp
    #include <QCoreApplication>
     
    #include "newspaper.h"
    #include "reader.h"
     
    int main(int argc, char *argv[])
    {
        QCoreApplication app(argc, argv);
     
        Newspaper newspaper("Newspaper A");
        Reader reader;
        QObject::connect(&newspaper, &Newspaper::newPaper,
                         &reader,    &Reader::receiveNewspaper);
        newspaper.send();
     
        return app.exec();
    }

    终端输出 Receives Newspaper: Newspaper A 这样的字样。

    注:

      1:只有继承了 QObject 类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承 QObject。凡是 QObject 类(不管是直接子类还是间接子类),都应该在第一行代码写上 Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。

       2:signals 块所列出的,就是该类的信号。信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现(我们曾经说过,Qt 程序能够使用普通的 make 进行编译。没有实现的函数名怎么会通过编译?原因还是在 moc,moc 会帮我们实现信号函数所需要的函数体,所以说,moc 并不是单纯的将 Q_OBJECT 展开,而是做了很多额外的操作)。

      3:qDebug用于在控制台输出调试信息

    1、类似c++的cout函数

    QString str="world";

    qDebug()<<"hello "<<str<<"!"<<endl;

    2、构造函数直接引入参数

    -字符串拼接

    QString str="world!";

    qDebug("hello "+str);

    -类似mfc中CString的format函数

    int year=18;

    qDebug("今年我%d",year);

      4:  emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。emit 的含义是发出,也就是发出 newPaper() 信号。

      5:任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。与信号函数不同,槽函数必须自己完成实现代码。槽函数就是普通的成员函数,因此作为成员函数,也会受到 public、private 等访问控制符的影响

  • 相关阅读:
    Sqli-labs Less-28a 绕过unions+select过滤 union注入
    eclipse安装freemarker-ide插件
    Eclipse调试时出现source not found的问题
    POJ 1509 Glass Beads 后缀自动机 模板 字符串的最小表示
    1028/3/7 被踩爆的省选模拟赛 30分
    字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机
    2018/3/6 省选模拟赛 60分
    埃及分数 a* 搜索 知识点mark
    UOJ #35. 后缀排序 后缀数组 模板
    BZOJ 4566 JZYZOJ 1547 [haoi2016T5]找相同子串 后缀数组 并查集
  • 原文地址:https://www.cnblogs.com/lizhanzhe/p/10832889.html
Copyright © 2011-2022 走看看