0
点赞
收藏
分享

微信扫一扫

Python爬取城市天气数据,并作数据可视化

扒皮狼 2023-06-22 阅读 83

如果查看Qt的源码,会发现很多类都会有一个***Private类。这是Qt用于封装私有操作的一种设计模式。

给出一个继承自QObject的Private类具体的实现:

MyClass.h

#include "QObject"

class MyClassPrivate;
class MyClass: public QObject{
Q_OBJECT
public:
    MyClass();
    ~MyClass();
    void foo();
    void foo2();
private:
    Q_DECLARE_PRIVATE(MyClass)
    Q_DISABLE_COPY(MyClass)
    MyClassPrivate * const d_ptr;
};

MyClassPrivate.h :注意这里继承自QObject

class MyClassPrivate: public QObject{
    Q_OBJECT
    Q_DECLARE_PUBLIC(MyClass)
public:
      MyClassPrivate(MyClass*parent) ;
      ~MyClassPrivate() ;
      void bar();
      void bar2();
private:
    MyClass *  const  q_ptr;
};

MyClass.cpp --注意这种形式Private类实现写在了MyClass.cpp中


#include "MyClass.h"
#include "QDebug"
#include "MyClassPrivate.h"
MyClassPrivate::MyClassPrivate(MyClass*parent): q_ptr(parent) {
    qDebug()<<"-------init MyClassPrivate---------";
}

MyClassPrivate::~MyClassPrivate() {

}

void MyClassPrivate::bar() {
    qDebug()<<"--------MyClassPrivate::bar--------";
}

void MyClassPrivate::bar2() {
    Q_Q(MyClass);
    qDebug()<<"--------MyClassPrivate::bar2--------";
    q->foo2();
}

MyClass::MyClass(): d_ptr(new MyClassPrivate(this)) {
    qDebug()<<"--------init MyClass--------";
}

MyClass::~MyClass() {
    delete d_ptr;
}

void MyClass::foo() {
    qDebug()<<"--------MyClass::foo--------";
    Q_D(MyClass);
    d->bar();
    d->bar2();
}

void MyClass::foo2() {
    qDebug()<<"--------MyClass::foo2--------";
}

main.cpp

#include <QCoreApplication>
#include <QDebug>
#include "MyClass.h"

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    qDebug() << "Hello World";
    MyClass pub;
    pub.foo();
    return QCoreApplication::exec();
}

对应CMake目录有两种结构,在CMakeList实现上 针对这两种结构有一点区别

首先是第一种结构:

 

 这种结构中规中矩,会把Private类暴露给客户

第二种结构:Private对客户隐藏,不对外暴露在include文件夹里

 这种时候不修改Cmake编译不通过

原因是Private类的Q_OBJECT在编译期间moc展开未被正确连接。 

举报

相关推荐

0 条评论