自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 资源 (6)
  • 收藏
  • 关注

原创 Qt笔记 -- Qt对象类型QObject源码中间接层的设计思想

如果查看QObject类型定义,可以发现类型里面有很多成员函数,但是除了 d_ptr之外,就没有定义更多的成员变量。当然,没有定义更多成员变量并不等于QObject对象实例中就只有d_ptr这一个数据。现在让我们来讨论这么一个问题,QObject肯定是有内部状态数据的,那么内部状态数据保存在哪儿呢?......

2022-07-03 21:40:27 475 1

原创 COM编程(1)-- 为什么需要COM

1. COM基础COM是一种规范,COM是一种规范,而不是实现。当使用C++来实现时,COM组件就是一个C++类,而COM接口就是继承至IUnknown的纯虚类,COM组件就是实现相应COM接口的C++类。COM规范规定,任何组件或接口都必须从IUnknown接口中继承而来。IUnknown定义了3个重要函数,分别是QueryInterface、AddRef和Release。其中,QueryInterface负责组件对象上的接口查询,AddRef用于增加引用计数,Release用于减少引用计数

2021-11-07 21:48:56 524

原创 深入C++对象模型(2) -- 构造、析构函数

C++语言编译过程中,编译器会背着程序员做了很多工作,其中默认构造函数就是其中一件工作。编译器对代码的干涉动作比较可能发生在“Member initialization”或者“named return value optimization”(NRV)身上,这些干涉动作会带来“程序形式”和“程序效率”上的冲击。一、名词解释implicit:暗中的,隐式的(通常指并非在源代码中出现的) explicit:显示的(通常意指成员源码中所出现的) trivial:没有用的 nontri...

2021-10-31 10:15:28 362 2

原创 Window系统下开发Qt(13)-- QSignalMapper的运用

一般点击一个按钮,并且想将预先定好的参数一同发送出去时,由于按钮的点击事件clicked()并没有参数,那么按照一般的做法就会先定义一个槽与clicked()信号关联,然后获取参数,再通过自定义的信号将该参数发送出去。 这个过程无疑是繁琐的,为此,Qt提供了QSignalMapper这个类来解决这个问题。同时,这个类可以连接多个按钮,匹配发送信号的对象对应的整数、字符串,窗口指针,继承于QObject的对象参数重新发送它们。现在我们创建一个类似计算器的窗口,添加如下代码:SignalMappe.

2021-10-31 09:54:38 289

原创 Window系统下开发Qt(11)-- Qt事件重写

在使用Qt的事件机制时,应该按照以下思路,从低级到高级进行重写,添加自己的业务逻辑。重写paintEvent、mousePressEvent等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。 重写event函数。event函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。 在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对

2021-10-24 11:43:52 1282

原创 Window系统下开发Qt(10)-- Qt事件

概述在讨论Qt的事件之前,先叙述两个准备知识点。1. 典型的win32程序如下所示: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) {  TranslateMessage(&msg);  DispatchMessage(&msg);  ... }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM,...

2021-10-23 22:30:26 1329 3

原创 C++中的odr

// The main module. File: odr_test1.cpp #include <iostream>void module1_print(); // declaration of an exeternal functioninline int f1(){ return 4;}class A{public: static double f() { return 4.1; }};const double C = 4.2;constex.

2021-09-11 22:00:28 547

原创 深入C++对象模型(5) -- 成员初始化列表

一、什么是初始化列表?C++类的成员变量初始化有两种途径,第一种是在类的constructor函数本体内,另一种途径就是经由初始化列表(initialization list)。如:在构造函数体内初始化:class Person{public: Person() { name = 0; age = 0; }private: String name; int age;};使用初始化列表初始化:class P...

2021-09-11 20:31:28 593

原创 深入C++对象模型(1) -- C++的三种模型

从本篇博客开始,根据《深入C++对象模型》这本书,加上自己的理解,探讨C++的对象模型以及相关的问题。博客尽量使用书中的名词、图例和例程。C++是面向对象的语言,类是C++与C的区别。在C++中,有两种class data members:static和nonstatic,以及三种class member function:static、nonstatic和virtual。已知有下面这个class Point声明:class Point{public: Point(float x); v.

2021-09-11 18:35:07 838

原创 XML解析之SAX方式

XML解析之SAX方式解析xml文件SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。SAX解析可分四个步骤进行:1、得到xml文

2021-09-05 20:23:01 2155 1

原创 Window系统下开发Qt(9)-- MOC文件的两种生成方式

这是因为在此程序中使用了Q_OBJECT宏,这个宏是Qt对C++的扩展。需要要先使用Qt提供的moc程序生成moc文件,然后再用C++编译器编译此文件,才能正常链接。一种方式是在VS中设置自定义生成工具来生成moc文件。设置自定义生成工具,就是指定生成工具的路径和命令参数,以及输出文件。在VS编译前会先调用自定义生成工具来生成相关代码。命令行:$(QT5_DIR)\bin\moc.exe %(Filename).h -o moc_%(Filename).cpp输出:moc...

2021-09-04 20:08:47 3235

原创 Window系统下开发Qt(8)-- QString 写时拷贝

QString内部有共享机制。所谓共享机制,就是假若将QString字符串str1赋值给str2,实际str2并没有拷贝str1的数据,只是将str2中数据指针指向了str1。意味着str1和str2的存储数据的内存是同一块地址。这样就实现了共享,节省内存。但是,这样有个问题,假如后面改了str2的数据,那个str1的数据也会跟着改变,这样会引发问题。qt在此问题上采用写时复制机制。也就是,在修改str2的数据时,先将str2指向的内存数据复制一份出来,然后将str2指向新复制的内存,这样str1和st

2021-09-04 20:00:28 1557

原创 COM编程(2)-- 第一个COM组件

实现一个COM组件,需要完成以下工作:COM组件接口 COM组件实现类 COM组件创建工厂 COM组件注册与反注册本文以一个例子作为说明,COM组件实现了一个矩形类,提供了两个接口,IAbstructShape和IDisplay。IAbstructShape接口提供了shapeType接口函数,返回矩形类的类型。IDisplay接口提供了draw接口函数,将在屏幕上绘制出矩形。一、COM组件的实现代码目录结构如下||--include |--IAbstructShape....

2021-09-04 14:00:49 866

转载 Win32笔记(2)-- 捕获DUMP

#include "Windows.h"#include "DbgHelp.h"int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers){ // 定义函数指针 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_U.

2021-08-24 11:13:41 212

原创 Window系统下开发Qt(7)-- CMake构建引用了Qt的项目

在项目中使用qt,需要将涉及Qt头文件和库包含进来,如果工程中使用了Q_OBJECT宏或*.ui文件,还需要使用moc或uic编译器先编译这些文件,才能在项目中参与编译。qt库的引入可以使用vcpkg来实现。Window系统下开发Qt(1)-- 第一个Qt程序若项目是由CMake来构建的,如何在cmake中使用vcpkg,可以参考博客:CMake中使用vcpkg本文在上面的博客的基础上,讨论如何用cmake自动编译Q_OBJECT宏或*.ui文件。目录结构:||--main.cpp|..

2021-08-22 18:26:01 1495

原创 Window系统下开发Qt(6)-- Qt默认连接槽和信号

一般的,将槽函数和信号连接在一起,要使用connect函数,例如:MyWindow::MyWindow(){ m_ui = new Ui::MyWindowUI(); m_ui->setupUi(this); connect(m_ui->btnShowMsg, SIGNAL(clicked()), this, SLOT(onClicked()));}MyWindow::~MyWindow(){}void MyWindow::onClicked(){ QMessa

2021-08-22 17:30:53 402

原创 CMake中使用vcpkg

vcpkg是一个微软开源的C++包管理器。在以前的开发中,如果在项目中需要使用某个开源库,例如qt,我们需要取官网下载qt的源码,然后构建得到对应的库,然后在项目中链接这个库。对于自己熟悉的库还好说,若是不熟悉的库,如何拉取源码?如何构建?如何在项目中引用?等等这些问题通常会困扰我们,然而,大多数情况下,我们只是使用这个开源库,并不需要关心这个库的构建和编译等问题。如此,在以前的开发过程中,往往会花费不少的时间在引入开源库上。vcpkg是在背景下开发出来的,通过vcpkg,我们可以在项目中很方便的引

2021-08-22 09:46:55 2719 2

原创 Window系统下开发Qt(5)-- 信号与槽原理

Qt的核心之一就是信号与槽。信号与槽类似观察者模式。在面向对象的编程中,都会创建很多实例,而每个实例都是独立的,要想每个实例能够协同合作,那么就会需要一种对象间传递消息的机制,在很多框架中都采用回调函数来进行对象间信息传递。回调函数就是一个函数指针,如果想要一个处理函数通知一些事件,你需要将这个指针传递给处理函数。处理函数在适当时间调用回调函数。MFC就是使用的回调函数,但回调可能是不直观的,不易于理解的,并且也不能保证是类型安全的。(1)回调函数C++虽然是面象对象的语言,但程序的具体实.

2020-11-22 21:03:16 464 1

原创 Window系统下开发Qt(4)-- 生成 ui 对应的 .h和 .cpp 文件

Qt 生成 ui 对应的 h 文件和 cpp 文件的方法将ui文件copy到uic.exe同一目录下(qt的安装目录中bin下)。 打开cmd,输入上述目录的路径。 输入:uic Com.ui -o Com.h uic Com.ui -o Com.cpp上述两条指令分别生成了h文件和cpp文件。...

2020-10-12 21:05:50 728

原创 Window系统下开发Qt(3)-- 在图片上绘制图形

在图像处理程序中,经常需要在图片上绘制一些图像,用以提示用户或展示一些信息。例如,需要绘制一个矩形框,显示当前处理的图像是原图像的一部分。一般在Qt中,可以使用QLabel控件来显示图片。但是使用QLabel既显示图片又显示自己绘制的图形,会很不方便。可以自定义个类,继承自QLabel,并且重写QLabel的paintEvent方法,在此方法中,绘制自己的图形。这里自定的类为MyLabel,源码如下:MyLabel.h#pragma once#include <QtWi...

2020-08-16 13:38:50 1742

原创 Window系统下开发Qt(2)-- 使用moc编译信号与槽

在windows下VS中开发Qt程序,若要是使用Qt的信号与槽,就得在类中使用Q_OBJECT宏,使用这个宏实际就是让Qt额外生成一些代码。若要使用这个宏,就必须使用Qt提供的moc.exe程序,来生成中间文件,下面举例介绍如何使用。例子:在窗口中,有两个控件,一个输入框(QTextEdit),一个显示文本(QLabel)控件,最终效果是在输入框中输入的文本实时性的显示在显示控件上。代码如下:MyWidget.h#pragma once#include <QtWidget...

2020-08-15 21:50:27 435

原创 Window系统下开发Qt(1)-- 第一个Qt程序

Windows下开发环境一般使用的Visual Studio,本人使用的是Visual Studio 2017(VS2017),在使用Qt框架时,也可以使用QtCreator,但是QtCreator调试功能没有VS那么强大,因此,本人比较推荐在VS中使用Qt框架。但在VS中使用Qt库,涉及到一系列的编译环境(头文件路径、链接的库等)设置,稍不注意就会编译不过。在这里推荐一个快捷的方式,使用微软的vcpkg来管理第三方库,可以免去下载安装各种第三方库的烦恼,Qt也可以使用这个工具进行下载安装。如.

2020-07-05 21:05:35 583

原创 C++笔记--模板类Traits的用法探讨

需求:设计一个绘制引擎,可以绘制不同的图形(比如:Rectangle、Circle、Polygon等)。目标:绘制引擎具有拓展性,易维护等特点。思路:绘制不同的图形的基本流程是一样的,首先需要将图形数据复制到特定的容器内,每个图形类提供了一个绘制器,调用每个类型的绘制方法,传入数据。绘制后的数据在特定的容器内,并且显示的方法都是一样(调用显卡的驱动程序,把数据复制进去即可)RectangleTraits.h#include <iostream>class RectangleT

2020-05-23 14:32:36 201

原创 C++笔记-临时对象的生命周期

看下面的代码#include <iostream>class MyClass{public: MyClass() { std::cout << "constructor" <<std::endl; } ~MyClass() { std::cout << "deconstructor" << std::endl; } void print() { std::cout << "print" <

2020-05-14 16:24:22 393

原创 阅读《Effective C++》的感悟

之前看过《Effective C++》这本书,对书中的内容印象较深刻,作者提供了很多对软件开发和设计非常有帮助的建议。最近第二次再次研读这本经典的著作,阅读到其中的一些内容时会联系到自身工作中的方案设计,结合自身的工作经验将一些感悟记录下来。1、让接口容易被正确使用,不易被误用这是原书第18条,当我们在设计一个类的时候,可能会提供一些接口给其他人使用(这里的其他人指的是使用你写的代码的其他...

2019-09-08 22:34:22 430

原创 C++对象模型(1) -- 成员初始化列表

本文是本人学习《C++对象模型》一书后加上自己的理解,将一些知识记录之1、什么是初始化列表?C++类的成员变量初始化有两种途径,第一种是在类的constructor函数本体内,另一种途径就是经由初始化列表(initialization list)。如:在构造函数体内初始化:class Person{public: Person() { name = 0;...

2019-08-07 00:00:02 215

原创 Win32笔记(1)-- 消息机制

在传统的C程序中,当我们需要打开一个文件时,可以调用fopen()函数,这个函数最终会调用操作系统提供的函数以此来打开文件。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的...

2019-08-05 00:06:35 391

原创 遇到的问题

gtest编译出现大量的错误:https://blog.csdn.net/jewelsu/article/details/95205226

2019-07-19 23:03:55 173

原创 一个小时学会Git

一个小时学会Git目录一、版本控制概要 工作区 暂存区 本地仓库 远程仓库 1.1、什么是版本控制 1.2、常用术语 1.3、常见的版本控制器 1.4、版本控制分类 1.4.1、本地版本控制 1.4.2、集中版本控制 1.4.3、分布式版本控制 1.5、Git与SVN最主要区别 二、Git安装与配置 2.1、什么是Git 2.2、搭...

2019-07-11 17:02:51 432

原创 __cdecl和__stdcall的区别和联系

1、__cdecl和__stdcall  __cdecl是CDeclaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。  __stdcall是StandardCall的缩写,是C++的...

2019-07-11 15:08:51 9506 6

原创 GTest使用教程(三)-- 运行参数

1 前言使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。2 基本介绍前面提到,对于运行参数,gtest提供了三种设置的途径:系统环境变量命令行参数代码中指定FLAG因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后...

2019-06-16 22:40:15 21898 2

原创 GTest使用教程(二)-- 断言和宏测试

上一讲介绍了GTest的安装和如何在项目中使用GTest,这一讲主要介绍GTest的断言机制和宏测试断言GTest采用一系列的断言(assertion)来进行代码测试,这些宏有点类似于函数调用。当断言失败时Google Test将会打印出assertion时的源文件和出错行的位置,以及附加的失败信息。用户可以直接通过“<<”在这些断言宏后面跟上自己希望在断言命中时的输出信息。...

2019-06-16 16:24:22 12954

原创 C++中static_cast和dynamic_cast强制类型转换

在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。一、static_cast关键字(编译时类型检查)用法:static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性,它主要有如下几种用法:(1)用于基本数据类型之间的...

2019-04-08 14:00:06 178

原创 Qt笔记 -- 布局器的addStretch函数使用效果

QBoxLayout中addStretch函数说明:void QBoxLayout::addStretch(int stretch = 0)Adds a stretchable space (a QSpacerItem) with zero minimum size and stretch factor stretch to the end of this box layout.函数的作...

2019-03-27 16:16:22 464

原创 Qt笔记 -- 高分屏下界面适配处理

在高分屏的设备内,如果程序没有进行适配,那么界面就会太小而看不清楚,而且系统显示比例的缩放对程序也不生效。下面是Qt程序界面显示适配系统缩放的一种解决方法。Qt封装 // 获取屏幕的横纵向dpi int dpiX = QApplication::desktop()->logicalDpiX(); int dpiY = QApplication::desktop()->logic...

2019-03-27 14:37:41 2222 1

原创 Qt笔记 -- QSetting的使用

这个枚举类型指定QSettings所使用的存储格式。常量 值 描述QSettings::NativeFormat 0 使用平台最合适的存储格式设置。在Windows中,使用系统注册表;OS X和iOS中,使用的是CFPreferences API;在Unix中,使用的是INI格式的文本配置文件。QSettings::IniFormat 1 存储在INI文件中的设置。QSetti...

2019-03-25 16:48:15 4044 3

原创 Qt笔记 -- 控件sizepolicy属性的含义

可以设置一下 QLabel 的 sizepolicy 属性点击查看原始尺寸Fixed: 大小不能改变Minimum: 已经是最小, 不能再被缩小, 但能放大.Maximum: 已经是最大, 不能再被放大, 但能缩小.Preferred: 控件的sizeHint()是他的sizeHint, 能被缩小, 放大.Expanding: 控件可以自行增大或者缩小.Preferred与Ex...

2019-03-19 11:51:19 6912

原创 CMake简易教程

cmake_minimum_required(VERSION 2.8) 检查cmake的版本,至少为2.8project(helloworld) 工程名为helloworldaux_source_directory(. SRC_LIST) ...

2019-03-18 18:20:50 638

原创 C++笔记 -- move_if_noexcept

move_if_noexceptstd::move()总是返回一个xvalue,即无名的T&amp;&amp;std::move_if_noexcept()根据条件,可能返回T&amp;&amp;或者const T&amp;std::move_if_noexcept()是模板函数,总能根据实参推演做实例化为不同的静态多态函数。否则普通函数怎么即返回X类型,有返回Y类型呢?简单的说,如果类型...

2019-02-28 17:35:06 934 1

原创 C++笔记 -- 使用移动构造函数的注意点

了理解他,我们来看这样一段代码:Test.h 文件:#pragma once#include&lt;iostream&gt;#include&lt;string&gt;using namespace std;class Test{public: Test(const string&amp; s = "hello world") :str(new string(s)) { cou...

2019-02-28 16:33:28 781

CMakeDemo.zip

CMakeDemo的示例代码。blog地址https://blog.csdn.net/W_Y2010/article/details/88646724

2020-05-04

C++ dll编程教程

DLL编程的教程,包含静态库,动态库,动态加载,静态加载,导出函数,def文件,导出类

2018-05-23

C++DLL编程Demo

Dll的demo,里面包含五个VS2010工程,是学习dll编程的最好代码。对应的教程请参考https://blog.csdn.net/W_Y2010/article/details/80428067

2018-05-23

AES加密算法demo

这是一个AES加密和解密Demo,纯C/C++实现,可以实现加密和解密。

2016-11-24

KNN算法C#例程

本例程是一个完整的学习KNN算法的工程,使用VS2010+C#编程,含训练数据及测试数据

2016-05-04

学嵌入式必知的两百个电路

学习嵌入式必知的200电路,包含各种类型,有MCU,电源,模拟电路,数字电路,还有各种实际应用电路

2013-05-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除