学习笔记
文章平均质量分 69
会会会飞的鱼
IT攻城狮
展开
-
Qt笔记 -- Qt对象类型QObject源码中间接层的设计思想
如果查看QObject类型定义,可以发现类型里面有很多成员函数,但是除了 d_ptr之外,就没有定义更多的成员变量。当然,没有定义更多成员变量并不等于QObject对象实例中就只有d_ptr这一个数据。现在让我们来讨论这么一个问题,QObject肯定是有内部状态数据的,那么内部状态数据保存在哪儿呢?......原创 2022-07-03 21:40:27 · 556 阅读 · 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 · 579 阅读 · 0 评论 -
深入C++对象模型(2) -- 构造、析构函数
C++语言编译过程中,编译器会背着程序员做了很多工作,其中默认构造函数就是其中一件工作。编译器对代码的干涉动作比较可能发生在“Member initialization”或者“named return value optimization”(NRV)身上,这些干涉动作会带来“程序形式”和“程序效率”上的冲击。一、名词解释implicit:暗中的,隐式的(通常指并非在源代码中出现的) explicit:显示的(通常意指成员源码中所出现的) trivial:没有用的 nontri...原创 2021-10-31 10:15:28 · 391 阅读 · 2 评论 -
Window系统下开发Qt(13)-- QSignalMapper的运用
一般点击一个按钮,并且想将预先定好的参数一同发送出去时,由于按钮的点击事件clicked()并没有参数,那么按照一般的做法就会先定义一个槽与clicked()信号关联,然后获取参数,再通过自定义的信号将该参数发送出去。 这个过程无疑是繁琐的,为此,Qt提供了QSignalMapper这个类来解决这个问题。同时,这个类可以连接多个按钮,匹配发送信号的对象对应的整数、字符串,窗口指针,继承于QObject的对象参数重新发送它们。现在我们创建一个类似计算器的窗口,添加如下代码:SignalMappe.原创 2021-10-31 09:54:38 · 341 阅读 · 0 评论 -
Window系统下开发Qt(11)-- Qt事件重写
在使用Qt的事件机制时,应该按照以下思路,从低级到高级进行重写,添加自己的业务逻辑。重写paintEvent、mousePressEvent等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。 重写event函数。event函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。 在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对原创 2021-10-24 11:43:52 · 1363 阅读 · 0 评论 -
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 · 1550 阅读 · 4 评论 -
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 · 616 阅读 · 0 评论 -
深入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 · 789 阅读 · 0 评论 -
深入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 · 945 阅读 · 0 评论 -
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 · 3498 阅读 · 0 评论 -
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 · 1737 阅读 · 0 评论 -
COM编程(2)-- 第一个COM组件
实现一个COM组件,需要完成以下工作:COM组件接口 COM组件实现类 COM组件创建工厂 COM组件注册与反注册本文以一个例子作为说明,COM组件实现了一个矩形类,提供了两个接口,IAbstructShape和IDisplay。IAbstructShape接口提供了shapeType接口函数,返回矩形类的类型。IDisplay接口提供了draw接口函数,将在屏幕上绘制出矩形。一、COM组件的实现代码目录结构如下||--include |--IAbstructShape....原创 2021-09-04 14:00:49 · 1101 阅读 · 0 评论 -
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 · 270 阅读 · 0 评论 -
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 · 1695 阅读 · 0 评论 -
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 · 468 阅读 · 0 评论 -
CMake中使用vcpkg
vcpkg是一个微软开源的C++包管理器。在以前的开发中,如果在项目中需要使用某个开源库,例如qt,我们需要取官网下载qt的源码,然后构建得到对应的库,然后在项目中链接这个库。对于自己熟悉的库还好说,若是不熟悉的库,如何拉取源码?如何构建?如何在项目中引用?等等这些问题通常会困扰我们,然而,大多数情况下,我们只是使用这个开源库,并不需要关心这个库的构建和编译等问题。如此,在以前的开发过程中,往往会花费不少的时间在引入开源库上。vcpkg是在背景下开发出来的,通过vcpkg,我们可以在项目中很方便的引原创 2021-08-22 09:46:55 · 2911 阅读 · 2 评论 -
Window系统下开发Qt(5)-- 信号与槽原理
Qt的核心之一就是信号与槽。信号与槽类似观察者模式。在面向对象的编程中,都会创建很多实例,而每个实例都是独立的,要想每个实例能够协同合作,那么就会需要一种对象间传递消息的机制,在很多框架中都采用回调函数来进行对象间信息传递。回调函数就是一个函数指针,如果想要一个处理函数通知一些事件,你需要将这个指针传递给处理函数。处理函数在适当时间调用回调函数。MFC就是使用的回调函数,但回调可能是不直观的,不易于理解的,并且也不能保证是类型安全的。(1)回调函数C++虽然是面象对象的语言,但程序的具体实.原创 2020-11-22 21:03:16 · 525 阅读 · 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 · 815 阅读 · 0 评论 -
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 · 488 阅读 · 0 评论 -
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 · 412 阅读 · 0 评论 -
SQL教程
SQL教程本文是本人学习数据库和SQL时自己做的笔记,属于基本知识,现整理出来放在这里,供自己以后学习和查看。一、数据库基础知识1、基础知识(1)服务型、文件型数据库基本概念数据库(数据库文件)数据库管理系统(DBMS,Database management system)数据库系统数据库管理员(DBA,database administrato...原创 2018-05-21 23:27:50 · 8891 阅读 · 3 评论 -
DLL教程 - 如何编写动态链接库
一、 概述DLL(Dynamic Linkable Library)它提供一些可以直接使用的变量,类和函数。在经历了“无库—静态链接库—动态链接库”的历程后,dll使用十分广泛。本文主要介绍dll,顺便介绍静态库(.lib)的一些知识。1、静态链接库和动态链接库的异同点静态链接库和动态链接库都是共享代码,如果采用静态链重点内容接库(.lib),lib中的指令最终都会编译到最终的...原创 2018-05-23 23:34:05 · 18395 阅读 · 19 评论 -
QT笔记 -- connect函数的使用心得
QT connect的使用心得本文记录在项目中使用connect遇到的问题。连接了信号,但是槽函数没有响应,问题出在connect函数上connect的签名如下:connect(ui-&amp;amp;gt;bntShow,//sender 发送者 SIGNAL(clicked(bool)),// signal 信号(事件) this,// ...原创 2018-08-10 15:30:21 · 7403 阅读 · 1 评论 -
C++笔记 -- 模板总结
C++模板 总结引言模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。函数模板在c++入门中,很多人会接触swap(int&amp;amp;, int&amp;amp;)这样的函数类似代码如下:void swap(int&amp;amp;a , int&amp;amp; b) {int..原创 2018-11-24 20:11:09 · 228 阅读 · 0 评论 -
GTest使用教程(一)-- 编译,安装GTest
本文是GTest使用教程的第一篇,本文主要介绍如何用VS2010编译GTest,并在项目工程中运用GTest。下载GTestGTest是Google开源的单元测试框架,其源码在Github上,可以在Github上下载源码(地址GTest github 代码仓库地址),然后本地编译,就可以使用GTest了。若读者使用的是是VS2010,则需要下载1.6版本及以下的,1.7版本对应的是VS2...原创 2018-12-01 15:25:49 · 10682 阅读 · 7 评论 -
Qt笔记 -- QMetaObject::invokeMethod
qt 笔记1、https://blog.csdn.net/W_Y2010/article/details/80428067原创 2019-02-23 11:47:13 · 1367 阅读 · 0 评论 -
C++笔记 -- 使用移动构造函数的注意点
了理解他,我们来看这样一段代码:Test.h 文件:#pragma once#include<iostream>#include<string>using namespace std;class Test{public: Test(const string& s = "hello world") :str(new string(s)) { cou...原创 2019-02-28 16:33:28 · 831 阅读 · 0 评论 -
C++笔记 -- move_if_noexcept
move_if_noexceptstd::move()总是返回一个xvalue,即无名的T&&std::move_if_noexcept()根据条件,可能返回T&&或者const T&std::move_if_noexcept()是模板函数,总能根据实参推演做实例化为不同的静态多态函数。否则普通函数怎么即返回X类型,有返回Y类型呢?简单的说,如果类型...原创 2019-02-28 17:35:06 · 1055 阅读 · 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 · 4229 阅读 · 3 评论 -
Qt笔记 -- 控件sizepolicy属性的含义
可以设置一下 QLabel 的 sizepolicy 属性点击查看原始尺寸Fixed: 大小不能改变Minimum: 已经是最小, 不能再被缩小, 但能放大.Maximum: 已经是最大, 不能再被放大, 但能缩小.Preferred: 控件的sizeHint()是他的sizeHint, 能被缩小, 放大.Expanding: 控件可以自行增大或者缩小.Preferred与Ex...原创 2019-03-19 11:51:19 · 7158 阅读 · 0 评论 -
Qt笔记 -- 高分屏下界面适配处理
在高分屏的设备内,如果程序没有进行适配,那么界面就会太小而看不清楚,而且系统显示比例的缩放对程序也不生效。下面是Qt程序界面显示适配系统缩放的一种解决方法。Qt封装 // 获取屏幕的横纵向dpi int dpiX = QApplication::desktop()->logicalDpiX(); int dpiY = QApplication::desktop()->logic...原创 2019-03-27 14:37:41 · 2304 阅读 · 1 评论 -
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 · 515 阅读 · 0 评论 -
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 · 200 阅读 · 0 评论 -
遇到的问题
gtest编译出现大量的错误:https://blog.csdn.net/jewelsu/article/details/95205226原创 2019-07-19 23:03:55 · 214 阅读 · 0 评论 -
Win32笔记(1)-- 消息机制
在传统的C程序中,当我们需要打开一个文件时,可以调用fopen()函数,这个函数最终会调用操作系统提供的函数以此来打开文件。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的...原创 2019-08-05 00:06:35 · 474 阅读 · 0 评论 -
C++对象模型(1) -- 成员初始化列表
本文是本人学习《C++对象模型》一书后加上自己的理解,将一些知识记录之1、什么是初始化列表?C++类的成员变量初始化有两种途径,第一种是在类的constructor函数本体内,另一种途径就是经由初始化列表(initialization list)。如:在构造函数体内初始化:class Person{public: Person() { name = 0;...原创 2019-08-07 00:00:02 · 237 阅读 · 0 评论 -
TCP/IP协议五层模型浅析
TCP/IP协议五层模型从顶到下,TCP/IP协议可以分为5层,依次是应用层、传输层、网络层、数据链路层和物理层。应用层应用层向应用程序提供服务,这些服务按其向应用程序提供的特性分成组,并称为服务元素。有些可为多种应用程序共同使用,有些则为较少的一类应用程序使用。应用层为最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。其服原创 2016-09-14 11:16:55 · 3802 阅读 · 0 评论