- 博客(43)
- 资源 (1)
- 收藏
- 关注
原创 std::function的简易实现
这样做固然可以,但是使用时我们是不是得传递这个模板类的模板参数,还是使用以上的例子,我们现在必须得这样使用这个模板类。模板类(函数)的实例化,是在 预处理之后,编译之前;模板参数从构造函数的模板参数,移动到类模板参数中去,扩大了作用域;时显示指定类型,这是比较合理的,也更符合使用习惯;这个成员变量的类型应该是和构造函数的模板参数一个类型(,这样就可以将辅助类的类模板参数存储在辅助类中,然后想办法在。,我们使用什么样的材料(模板参数),就会生成什么样的代码;有了以上的思考,我们知道,将模板参数的作用域从。
2025-01-26 16:26:44
702
2
原创 记录模板学习(持续更新)
个人认为,这里的实现不是很好;这里是针对不同参数个数的函数,每一个都做一个重载,如果能实现一种方式,可以适配任意类型和数量的参数就好了。可调用对象包括:普通函数, lambda表达式, 类成员函数。学习C++模板的编写,使用模板类包装一个可调用对象。使用模板类包装类成员函数。
2024-12-09 16:57:20
312
2
原创 git submodule子模块的使用
查看当前是否处于某个分支,如果是处于正常的分支,那么可以直接进行添加和提交,和普通的提交流程一样。是将子仓更新到主仓库当前引用的节点,注意,主仓库当前引用的节点,并不一定是子仓库的最新节点;下载代码时,如果使用普通的 git clone来克隆项目,会发现项目的子模块文件夹中内容为空。若已经克隆完成主项目,但是此时子模块文件夹为空,可以在主仓库目录中使用。中的子模块被拉到本地时默认是一个子模块远程仓库master分支的。2.异常情况,如果进入子仓库,发现子仓库的状态为。1.正常情况,进入子仓库,使用。
2024-09-05 21:02:04
1657
1
原创 QPainter绘制文本显示不全
这里的水平对齐方式,无论是水平居中,水平居左,还是水平居右都可以。确实都可以计算文本的宽度,具体的差别,可以在帮助文档中查看,一般来讲,指的是文本的矩形区域,很多同学计算文本宽度时,使用的。其实是调用的第三个函数,且没有传递第三个参数;计算出来的文本宽度是正确的,只是我们不能这样调用。计算出来的数值要稍微大一点,很多同学就是使用。绘制文本时,前面的参数。函数计算出来的数值,会比。计算出文本宽度,然后使用。,结果发现文本显示不全;函数有很多重载版本,,可以参考一下此文章。函数来绘制,我们应该。
2024-09-02 13:28:37
503
1
原创 C++右值引用
引用不会导致新的对象产生(即不会调用构造函数、拷贝构造函数、移动构造函数),当被引用的对象析构时,那么这个引用就成为了一个垂悬引用,使用这个垂悬引用,会导致程序产生未定义行为。3.使用右值来构造一个对象,那就是调用的对象的移动构造函数。1.对左值的引用即为左值引用,对右值的引用即为右值引用。
2024-08-28 12:31:29
348
1
原创 信号和槽对值传递参数和引用传递参数的总结
(测试时,打印传递前后的地址不同) 2、connect时使用DirectConnection,测试结果和在同一线程中的结果相同。如果信号的参数是值类型,则在内部会自动处理拷贝,而如果是引用类型,则会自动生成相应的拷贝。这样可以在单线程环境中避免不必要的拷贝,在多线程环境中Qt会自动处理拷贝,保证线程安全性。但是在某些情况下,如果你确定参数是简单类型(例如int,char等),值传递也可以接受,因为这些类型的拷贝开销很小。在上述情况下,text参数不会被拷贝,直接传递引用,这样效率更高,尤其是对于大对象。
2024-06-12 14:00:14
409
原创 std::vector的emplace_back 与 push_back 比较
是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次移动构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次移动构造函数,两次析构函数。移动构造和移动赋值运算符的对象,移动构造和移动赋值运算符的对象,
2024-06-11 13:12:07
510
1
原创 (std::bind函数适配器)std::function函数包装器与类型擦除
比如一个模板的加法函数(比如多个类都调用此加法函数),可以实现对不同的数据类型的操作,如果对象也重载了加法,同样也可以使用。多态一般都很了解,可以通过父类型指针来管理子类型的指针,实现了对子对象类型的隐藏。但这种方式的缺点也非常明显,需要写继承的类而且数据类型的隐藏并不全面,至少父类型始终要暴露出来。所谓闭包,其实就是Lambda表达式,通过它和std::function的配合,实现类型的擦除。中,这个闭包对象在调用时,就无需传递参数了;即可,而无需再传递参数,这就实现了一种简单的类型擦除,将。
2024-05-14 17:14:23
509
1
原创 框架中的单例模式
上一节我们介绍了本节来讨论下,在框架代码中,怎样设计单例模式考虑这种场景:框架的开发者写了一个类Config用来管理整个程序运行周期中的配置文件,整个程序中应该只有一个配置文件类,所以站在框架开发者的角度,这个类就应该是全局单例;(这是一个典型的单例模式应用场景,单例模式还有一些其他的应用场景,比如:日志记录,线程池管理等)框架开发者为这个Config类提供了很多通用函数,也有一部分虚函数(站在框架设计者的角度,我们只能尽可能的考虑更多场景,提供一系列的通用函数;但是并不知道这个Config。
2024-04-20 13:50:04
1277
1
原创 C++ 为什么不能在构造函数中调用虚函数
但是我们创建的是DeriveClass这个派生类,在创建派生类之前会首先调用基类的构造函数来创建基类的数据,如果此时进入了基类构造函数中,那么当前对象指向的虚函数表地址为基类的虚函数表,并非派生类的虚函数表,从上面的执行结果就可以看出,当初始化好基类的构造函数之后,回到派生类的构造函数中时,获取的虚函数表地址已经变为了派生类的虚函数表地址,已经非基类的虚函数表地址。这里记录一下为什么不能在构造函数中调用虚函数。在基类的构造函数中,调用了。
2024-04-11 21:43:55
382
1
原创 关于自注册工厂模式的一点思考
分析这种方式与使用模板类的方式的区别,发现这种方式,每多一个子类,就需要在子类中使用。模板类,但是其实之前的注册方式,也可以抛弃掉模板类,直接在宏定义中完成创建和注册,例如。提一嘴,如果想要从工厂中直接拿到具体的子类指针,而不是父类指针,则可以将工厂类的。模板类,在类的构造函数中,创建模板对象,并将其注册到工厂类中,来实现自定义。框架中的自注册过程,并将其与我们上篇的自注册进行对比,总结各自的优劣势。的类,都需要一个静态函数,用来创建当前类的对象,使用时候,要用。获取到注册到工厂中的类对象,
2024-03-28 15:55:43
312
原创 单例模式模板
与之前不同的是,将创建对象的限制放在了用户类(即将构造函数设置为私有),构造函数私有化后,单例模板也无法创建对象,于是,将单例模板作为友元类, 模板类才能访问到用户类的构造函数。放开模板限制,在此不再删除取址操作(会影响返回对象的引用),取消模板类构造函数的私有化,作为基类,析构函数标记为virtual;
2024-03-11 13:54:13
693
2
原创 QT延时/等待
不够频繁的话,显然可能会使GUI线程的响应变差,例如每500ms才被调用一次,那么GUI的事件循环就只能500ms才被处理一次,当然,这个问题可以通过设定processEvents()的第二个形参略微得到缓解,更好的做法是,保证被调的周期
2024-03-05 17:22:36
4354
1
原创 Windows编译Poco库
windows下使用CMake和VS来编译POCO库1.下载poco 已发布的版本源代码: POCO发行版下载地址 (此次下载的是V1.9.4版本,注意,如果下载的版本过高,可能需要编译器支持 C++14/17,以及需要更高版本的CMake) :poco github 仓库地址:POCO github地址1) 进入poco-1.9.4文件夹,即源码目录,创建build文件夹2)打开windows的命令行,进入build目录,执行下面命令(注意:命令最后一句的 ):如果需要编译64位,则增加构建参数
2024-02-19 10:34:47
916
原创 HTTP中常见的Content-Type
响应头里的 Content-Type 参数会告诉我们响应数据的格式,一般我们可以在请求头里面设置我们想要的数据格式(Accept);:一般我们在 post 请求中会向服务器发送一些参数,那我们就可以通过这个参数设置 post 的参数格式。Content-type 定义了 http 请求/响应的数据类型。如果设置在请求头中,则定义的是请求体的数据类型;如果设置在响应头中,则定义的是响应体的数据类型;:表单默认的提数据格式;:JSON 数据格式;:一般用于文件上传;
2024-02-18 15:05:55
415
原创 从Poco::Net::HTTPServerRequest 中获取Content
尤其是数据中有 ‘=’ 存在的时候,Poco::Net::HTMLForm 会直接把 ‘=’ 作为分隔符使用,'=‘左边的是 name,’='右边的是 value。当 Poco 检测到 Content-Type 是 multipart/form-data 的时候,就会执行。方法,如果不是 multipart/form-data ,那么就执行。Poco::Net::HTMLForm 对象初始化的时候,会首先读取。如果接收到的数据是 json,那么最好不要使用。中的数据,然后对数据进行解析。
2024-02-07 13:39:19
630
原创 C++类型转换
* 了解了const_cast的使用场景后,可以知道使用const_cast通常是一种无奈之举,同时也建议大家在今后的C++程序设计过程中一定不要利用const_cast去掉指针或引用的常量性并且去修改原始变量的数值,这是一种非常不好的行为。reinterpret_cast可以将指针或引用转换为一个足够长度的整形,此中的足够长度具体长度需要多少则取决于操作系统,如果是32位的操作系统,就需要4个字节及以上的整型,如果是64位的操作系统则需要8个字节及以上的整型。向下转换,即将父类指针转化子类指针。
2024-01-15 18:33:32
835
原创 static 关键字与 const关键字
既可以通过类名调用静态成员函数,也可以通过类对象调用静态成员函数,因为静态成员函数只能访问静态成员变量,而静态成员变量是类中的变量,不是对象中的变量,这个类的所有对象共享同一份变量;非const对象,及可以调用const成员函数,也可以调用非const成员函数。const 对象只能调用const成员函数,不能调用非const成员函数;
2024-01-10 13:33:13
339
原创 自注册工厂模式
去写,框架的开发者更希望应用程序的开发者只关心自己的业务逻辑,而不需要去关心其他的因素,其他的处理框架可以帮应用程序的开发者处理好,这时候,我们希望应用程序的开发者将自己继承Sharp类写的具体图形类对象,注册到工厂中去,而又可以将。REGISTER_SHARP宏 是用来创建一个静态的 SharpRegister模板类对象,我们为了让这些静态类对象的对象名不重复,所以才有 CREATE_SHARP_NAME宏,用来生成对象名。类型的指针,并注册到工厂类中,在使用时候,我们仅需要创建。
2024-01-09 19:04:15
943
1
原创 C++ condition_variable
而条件变量同样是阻塞,还需要通知才能唤醒,线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,该线程就休眠了,应该仍阻塞在这里,等待条件满足后被唤醒,节省了线程不断运行浪费的资源。这种同步方式就是条件变量。两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加锁,B线程再加锁时候会被阻塞,直到A释放锁,B再获得锁运行,线程B必须不停的主动获得锁、检查条件、释放锁、再获得锁、再检查、再释放,一直到满足运行的条件的时候才可以(而此过程中其他线程一直在等待该线程的结束),这种方式是比较消耗系统的资源的。
2023-10-16 15:46:36
115
原创 Qt 中文乱码
1.如果源文件采用的UTF-8不带BOM的编码格式,一般可执行程序不会出现中文乱码;如果UTF-8不带BOM的编码格式,加上。注意:msvc必须是小写,亲测大写MSVC无效。另外,运行之前,建议清除一下,重新构建,删除之前的缓存。execution-charest表示执行字符集,source-charset表示源码字符集。源文件字符集:源文件本身也是文本文件,所以源文件字符集是指源文件保存时采用哪种字符编码。1.可以将以上代码放入一个单独的头文件,在需要使用处,包含此头文件;
2023-10-13 10:13:44
131
原创 QTableView添加ToolTips
可以发现ToolTips事件产生的坐标的X和Y都比视口坐标大,多出的正是表头的宽高;所以如果使用事件产生的坐标来计算模型索引,会得到不正确的索引位置。可以发现,ToolTips事件产生的坐标,就是视口的坐标。
2023-09-21 14:57:21
585
原创 Qt 嵌入外部窗口
1.在 Windows 系统中,每个窗口都有一个唯一的窗口句柄(Window Handle/HWND),用于在底层操作系统中标识和引用该窗口。3.在 Qt 中,为了与底层窗口系统进行交互,可以通过 WId 类型来传递和操作窗口句柄。WId 可以用于获取底层窗口系统的原生窗口句柄,从而实现与其他平台相关的功能。在Qt窗口中嵌入外部应用程序的窗口,可以利用QT中的QWindow类和WId(Window Identifier)来处理;2.而在Qt框架中,WId 正是用于表示窗口句柄的类型;
2023-09-14 13:24:27
2238
原创 Qt MouseMove与HoverMove
鼠标在button和label上移动时,MainWindow都不能收到mouseMove事件,除非对button和label都执行。3.举例,QMainWindow若想捕捉客户区域的mouseMove事件,则QMainWindow和其中的centralWidget子部件都需要执行。Qt中的mouseMove事件,默认情况下是需要按住鼠标左键移动时,才会相应Qt::mouseMoveEvent;则父窗口是捕捉不到子窗口(控件)的mouseMoveEvent。
2023-09-04 09:37:39
1452
原创 Qt自定义属性样式
这是因为:Qt在第一次设置QWidget的样式时,会进行"polish"操作,这个操作会把样式信息缓存起来。之后如果只是设置属性;比如设置select属性的值,并不会重新触发样式的计算,导致QLabel无法感知select属性的变化,还是使用之前缓存的样式。调用unpolish可以清除之前的样式缓存。再调用polish就会重新计算QWidget的样式,此时会根据当前select属性值选择合适的qss规则进行渲染。
2023-08-31 16:48:23
349
转载 QPixmap与QImage区别
Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture。QImage 是为 I/O 和直接像素访问和操作而设计和优化的,而 QPixmap 是为在屏幕上显示图像而设计和优化的。QBitmap只是一个继承QPixmap的便利类,保证深度为1。如果QPixmap对象是位图,isQBitmap()函数返回true,否则返回false。最后,QPicture 类是一个绘制设备,用于记录和重放 QPainter 命令。
2023-08-31 15:32:53
331
1
原创 Qt 绘制图片
这可能会导致一些不必要的绘制操作,特别是在显示大量图片或者在复杂的界面布局下。为了解决这个问题,我们可以自定义一个控件,重写paintEvent,使用drawPixmap或者drawImage来绘制图片,这样效率会比使用QLbael有所提高,也可以实现与QLabel一样的setPixmap()效果。在Qt开发中,经常会遇到显示图片的需求;QLabel的setPixmap方法是一个非常简单易用的方法,可以快速地将图片显示在界面上。的图片,并且不需要进行太多的自定义操作,那么这种方式可能是最好的选择。
2023-08-31 15:20:09
1086
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人