Qt使用技巧--定义Private类

news2024/9/21 3:21:58

如果查看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实现上 针对这两种结构有一点区别

首先是第一种结构:

 

cmake_minimum_required(VERSION 3.23)
project(MyClass)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#set(CMAKE_PREFIX_PATH C:\\Qt\\Qt5.15.2\\5.15.2\\msvc2019_64)
include_directories(include )

file(GLOB_RECURSE  DIR_INC_PUB include/*.h) #Qt使用的时候
aux_source_directory(src DIR_SRC)

find_package(Qt5 COMPONENTS
        Core
        REQUIRED)

add_executable(MyClass ${DIR_SRC}  ${DIR_INC_PUB}  )
target_link_libraries(MyClass
        Qt5::Core
        ) 

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

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

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

一种解决方案是去掉Private类里的Q_OBJECT宏,这时可以编译通过

 另一种是修改CMake

file(GLOB_RECURSE  DIR_INC_PRIVATE src/*.h)
add_executable(MyClass ${DIR_SRC}  ${DIR_INC_PUB} ${DIR_INC_PRIVATE})

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

当然,也可以把Private类的实现单独写在***Private.cpp,这个时候就不会有编译问题。

 但这样的结构上就稍微不如之前的形式了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain让LLM连接更多能力

随着LLM&#xff08;Large language models &#xff09;的发展&#xff0c;不仅仅出现了很多新的应用&#xff0c;一些开发框架也发展很快&#xff0c;典型的就是本文介绍的项目——LangChain&#xff0c;目前LangChain几乎一天一个版本&#xff0c;几个月时间Star数目已经49k…

<C++> C++11 Lambda表达式

C11 Lambda表达式 1.C98中的一个例子 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 #include <algorithm> #include <functional> int main() {int array[] {4, 1, 8, 5, 3, 7, 0, 9, 2, 6};// 默认按照小于…

软考:软件工程:面向对象技术与UML,时序图,用例图,类对象,封装,继承,多态

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

iOS 集成Jenkins pipeline 完整流程

文章目录 一 创建一个Jenkins pipeline 项目配置分支参数在工程中添加 ExportOptions.plist 文件创建放置打包文件的文件夹在工程里面添加shell脚本文件配置pipeline sript构建 一 创建一个Jenkins pipeline 项目 配置分支参数 选择参数化构建构成&#xff0c;如上图所示&#…

网络层实验报告

计算机网络综合实训 实训报告二 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2022.3.29 网络层实验报告 &#xff08;湖北师范大学计算机与信息工程学院 中国 黄石 435002&#xff09; 1 IP分析 1.1背景知识 1.1.1 什么是…

SpringMVC系列-2 HTTP请求调用链

背景 本文作为 SpringMVC系列 第二篇&#xff0c;介绍HTTP请求的调用链&#xff1a;从请求进入Tomcat到数据流返回客户端的完整过程。为了尽可能把流程表达清楚&#xff0c;进行了很多减支处理&#xff0c;只关注主线逻辑。 本文也作为SpringMVC系列后续文章的基础&#xff0…

软考A计划-系统集成项目管理工程师--一般常识-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

SpringBoot 异常处理的主要组件有哪些

SpringBoot 异常处理的主要组件有哪些 在 SpringBoot 应用程序中&#xff0c;异常处理是一个非常重要的话题。当应用程序出现异常时&#xff0c;我们需要对异常进行处理&#xff0c;以保证应用程序的稳定性和可靠性。SpringBoot 提供了一系列的组件&#xff0c;用于处理各种类…

简析IAST—Agent篇 | 信息安全

一、IAST简单介绍 IAST(Interactive Application Security Testing)交互式应用程序安全测试&#xff0c;通过服务端部署Agent探针&#xff0c;流量代理/VPN或主机系统软件等方式&#xff0c;监控Web应用程序运行时函数执行并与扫描器实时交互&#xff0c;高效、精准的安全漏洞&…

LeetCode 面试题 16.19. 水域大小

LeetCode 面试题 16.19. 水域大小 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/group-anagrams/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 你有一个用于表示一片…

C++初阶之初识C++

初识C 1.什么是C2.C的发展史2.1 历史渊源2.2 名称由来2.3 C标准 3.C的重要性3.1 语言的使用广泛度3.2 工作领域 4.如何学习C5.结语 1.什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度…

【k8s系列】一分钟搭建MicroK8s Dashboard

本文基于上一篇文章的内容进行Dashboard搭建&#xff0c;如果没有看过上一篇的同学请先查阅上一篇文章 k8s系列】使用MicroK8s 5分钟搭建k8s集群含踩坑经验 使用MicroK8s搭建Dashboard很简单&#xff0c;只需要在Master节点按照以下几步操作 1.启用Dashboard插件 microk8s en…

“Vue3+Vite打包后,白屏沉默,重启重试无果,我该如何解决?”

每次最后打包总是会或多或少出现一些问题&#xff0c;昨天打包项目完之后 直接点击dist中的index.html去看看有没有什么发题&#xff0c;一打开奇怪的事发生了&#xff0c;居然是空白&#xff1b;但是在vscode中右键Open with Live Server一看项目没啥问题&#xff0c;但是部署…

下载安装Python解释器和环境变量配置

一、 python解释器下载 1.百度python官网并打开 官网网址&#xff1a;https://www.python.org/ 在这里插入图片描述 2.选择DownLoads&#xff0c;Windows并打开 3.在下图页面选择你需要的版本下载即可&#xff08;本文以python 3.10.4版本演示&#xff09; 在这里插入图片描述 …

C++笔记之extern关键字

C笔记之extern关键字 code review! 文章目录 C笔记之extern关键字0.前言1.extern是C语言的关键字还是C中的关键字&#xff1f;2.extern关键字和全局变量3.ChatGpt讲述extern的用法4.extern一般用法4.1.在本模块中使用4.2.跨模块中使用 5.标准定义使用extern关键字的步骤7.ext…

Nginx 访问日志中有 Get 别的网站的请求是什么原因?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言理解 Nginx 访问日…

父亲的打,最让人想念。

11年前的端午节&#xff0c;父亲就走了。 父亲十五岁就外出打工&#xff0c;从小出去打工&#xff0c;吃了没有文化的苦&#xff0c;父亲从小教育我要好好读书&#xff0c;可我从来听不进。 所以我经常挨打。 老家在湖南的一个农村&#xff0c;我父亲十几岁就南下打工&#xff…

[进阶]网络通信:TCP通信,一发一收,多发多收

TCP通信 特点&#xff1a;面向连接、可靠通信。通信双方事先会采用 “三次握手〞 方式建立可靠连接&#xff0c;实现端到端的通信&#xff1b;底层能保证数据成功传给服务端。Java提供了一个java.net.socket类来实现TCP通信。 TCP通信——客户端开发 客户端程序就是通过java.…

基于OpenCV-车辆检测项目(简易版)

车辆检测 1.项目介绍2. 读取一段视频3.通过形态学处理识别车辆4.描画轮廓5. 车辆计数并显示 本项目使用的视频地址链接 1.项目介绍 对一个视频进行车辆数量的检测&#xff0c;用到的知识有视频的读取&#xff0c;滤波器&#xff0c;形态学&#xff0c;添加直线、文本&#xff…

黑马头条2

文章目录 前言一、接口工具1.1 postman1.2 swagger1.3 knife4j 二、 网关一、基本搭建二、全局过滤器jwt 三、 前端集成导入前端工程项目安装nginx测试 &#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;黑马头条开发&#x…