- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 信号和槽对值传递参数和引用传递参数的总结
(测试时,打印传递前后的地址不同) 2、connect时使用DirectConnection,测试结果和在同一线程中的结果相同。如果信号的参数是值类型,则在内部会自动处理拷贝,而如果是引用类型,则会自动生成相应的拷贝。这样可以在单线程环境中避免不必要的拷贝,在多线程环境中Qt会自动处理拷贝,保证线程安全性。但是在某些情况下,如果你确定参数是简单类型(例如int,char等),值传递也可以接受,因为这些类型的拷贝开销很小。在上述情况下,text参数不会被拷贝,直接传递引用,这样效率更高,尤其是对于大对象。
2024-06-12 14:00:14
284
原创 std::vector的emplace_back 与 push_back 比较
是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次移动构造函数,两次析构函数。,是调用一次构造函数,一次拷贝构造函数,两次析构函数。,是调用一次构造函数,一次移动构造函数,两次析构函数。移动构造和移动赋值运算符的对象,移动构造和移动赋值运算符的对象,
2024-06-11 13:12:07
350
原创 (std::bind)std::function与类型擦除
比如一个模板的加法函数(比如多个类都调用此加法函数),可以实现对不同的数据类型的操作,如果对象也重载了加法,同样也可以使用。多态一般都很了解,可以通过父类型指针来管理子类型的指针,实现了对子对象类型的隐藏。但这种方式的缺点也非常明显,需要写继承的类而且数据类型的隐藏并不全面,至少父类型始终要暴露出来。所谓闭包,其实就是Lambda表达式,通过它和std::function的配合,实现类型的擦除。中,这个闭包对象在调用时,就无需传递参数了;即可,而无需再传递参数,这就实现了一种简单的类型擦除,将。
2024-05-14 17:14:23
413
原创 框架中的单例模式
上一节我们介绍了本节来讨论下,在框架代码中,怎样设计单例模式考虑这种场景:框架的开发者写了一个类Config用来管理整个程序运行周期中的配置文件,整个程序中应该只有一个配置文件类,所以站在框架开发者的角度,这个类就应该是全局单例;(这是一个典型的单例模式应用场景,单例模式还有一些其他的应用场景,比如:日志记录,线程池管理等)框架开发者为这个Config类提供了很多通用函数,也有一部分虚函数(站在框架设计者的角度,我们只能尽可能的考虑更多场景,提供一系列的通用函数;但是并不知道这个Config。
2024-04-20 13:50:04
1209
原创 C++ 为什么不能在构造函数中调用虚函数
但是我们创建的是DeriveClass这个派生类,在创建派生类之前会首先调用基类的构造函数来创建基类的数据,如果此时进入了基类构造函数中,那么当前对象指向的虚函数表地址为基类的虚函数表,并非派生类的虚函数表,从上面的执行结果就可以看出,当初始化好基类的构造函数之后,回到派生类的构造函数中时,获取的虚函数表地址已经变为了派生类的虚函数表地址,已经非基类的虚函数表地址。这里记录一下为什么不能在构造函数中调用虚函数。在基类的构造函数中,调用了。
2024-04-11 21:43:55
323
原创 关于自注册工厂模式的一点思考
分析这种方式与使用模板类的方式的区别,发现这种方式,每多一个子类,就需要在子类中使用。模板类,但是其实之前的注册方式,也可以抛弃掉模板类,直接在宏定义中完成创建和注册,例如。提一嘴,如果想要从工厂中直接拿到具体的子类指针,而不是父类指针,则可以将工厂类的。模板类,在类的构造函数中,创建模板对象,并将其注册到工厂类中,来实现自定义。框架中的自注册过程,并将其与我们上篇的自注册进行对比,总结各自的优劣势。的类,都需要一个静态函数,用来创建当前类的对象,使用时候,要用。获取到注册到工厂中的类对象,
2024-03-28 15:55:43
265
原创 单例模式模板
与之前不同的是,将创建对象的限制放在了用户类(即将构造函数设置为私有),构造函数私有化后,单例模板也无法创建对象,于是,将单例模板作为友元类, 模板类才能访问到用户类的构造函数。放开模板限制,在此不再删除取址操作(会影响返回对象的引用),取消模板类构造函数的私有化,作为基类,析构函数标记为virtual;
2024-03-11 13:54:13
543
1
原创 QT延时/等待
不够频繁的话,显然可能会使GUI线程的响应变差,例如每500ms才被调用一次,那么GUI的事件循环就只能500ms才被处理一次,当然,这个问题可以通过设定processEvents()的第二个形参略微得到缓解,更好的做法是,保证被调的周期
2024-03-05 17:22:36
3097
原创 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
557
原创 HTTP中常见的Content-Type
响应头里的 Content-Type 参数会告诉我们响应数据的格式,一般我们可以在请求头里面设置我们想要的数据格式(Accept);:一般我们在 post 请求中会向服务器发送一些参数,那我们就可以通过这个参数设置 post 的参数格式。Content-type 定义了 http 请求/响应的数据类型。如果设置在请求头中,则定义的是请求体的数据类型;如果设置在响应头中,则定义的是响应体的数据类型;:表单默认的提数据格式;:JSON 数据格式;:一般用于文件上传;
2024-02-18 15:05:55
372
原创 从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
501
原创 C++类型转换
* 了解了const_cast的使用场景后,可以知道使用const_cast通常是一种无奈之举,同时也建议大家在今后的C++程序设计过程中一定不要利用const_cast去掉指针或引用的常量性并且去修改原始变量的数值,这是一种非常不好的行为。reinterpret_cast可以将指针或引用转换为一个足够长度的整形,此中的足够长度具体长度需要多少则取决于操作系统,如果是32位的操作系统,就需要4个字节及以上的整型,如果是64位的操作系统则需要8个字节及以上的整型。向下转换,即将父类指针转化子类指针。
2024-01-15 18:33:32
812
原创 static 关键字与 const关键字
既可以通过类名调用静态成员函数,也可以通过类对象调用静态成员函数,因为静态成员函数只能访问静态成员变量,而静态成员变量是类中的变量,不是对象中的变量,这个类的所有对象共享同一份变量;非const对象,及可以调用const成员函数,也可以调用非const成员函数。const 对象只能调用const成员函数,不能调用非const成员函数;
2024-01-10 13:33:13
314
原创 自注册工厂模式
去写,框架的开发者更希望应用程序的开发者只关心自己的业务逻辑,而不需要去关心其他的因素,其他的处理框架可以帮应用程序的开发者处理好,这时候,我们希望应用程序的开发者将自己继承Sharp类写的具体图形类对象,注册到工厂中去,而又可以将。REGISTER_SHARP宏 是用来创建一个静态的 SharpRegister模板类对象,我们为了让这些静态类对象的对象名不重复,所以才有 CREATE_SHARP_NAME宏,用来生成对象名。类型的指针,并注册到工厂类中,在使用时候,我们仅需要创建。
2024-01-09 19:04:15
881
原创 C++ condition_variable
而条件变量同样是阻塞,还需要通知才能唤醒,线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,该线程就休眠了,应该仍阻塞在这里,等待条件满足后被唤醒,节省了线程不断运行浪费的资源。这种同步方式就是条件变量。两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加锁,B线程再加锁时候会被阻塞,直到A释放锁,B再获得锁运行,线程B必须不停的主动获得锁、检查条件、释放锁、再获得锁、再检查、再释放,一直到满足运行的条件的时候才可以(而此过程中其他线程一直在等待该线程的结束),这种方式是比较消耗系统的资源的。
2023-10-16 15:46:36
91
原创 Qt 中文乱码
1.如果源文件采用的UTF-8不带BOM的编码格式,一般可执行程序不会出现中文乱码;如果UTF-8不带BOM的编码格式,加上。注意:msvc必须是小写,亲测大写MSVC无效。另外,运行之前,建议清除一下,重新构建,删除之前的缓存。execution-charest表示执行字符集,source-charset表示源码字符集。源文件字符集:源文件本身也是文本文件,所以源文件字符集是指源文件保存时采用哪种字符编码。1.可以将以上代码放入一个单独的头文件,在需要使用处,包含此头文件;
2023-10-13 10:13:44
105
原创 QTableView添加ToolTips
可以发现ToolTips事件产生的坐标的X和Y都比视口坐标大,多出的正是表头的宽高;所以如果使用事件产生的坐标来计算模型索引,会得到不正确的索引位置。可以发现,ToolTips事件产生的坐标,就是视口的坐标。
2023-09-21 14:57:21
392
原创 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
1822
原创 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
1016
原创 Qt自定义属性样式
这是因为:Qt在第一次设置QWidget的样式时,会进行"polish"操作,这个操作会把样式信息缓存起来。之后如果只是设置属性;比如设置select属性的值,并不会重新触发样式的计算,导致QLabel无法感知select属性的变化,还是使用之前缓存的样式。调用unpolish可以清除之前的样式缓存。再调用polish就会重新计算QWidget的样式,此时会根据当前select属性值选择合适的qss规则进行渲染。
2023-08-31 16:48:23
281
转载 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
228
1
原创 Qt 绘制图片
这可能会导致一些不必要的绘制操作,特别是在显示大量图片或者在复杂的界面布局下。为了解决这个问题,我们可以自定义一个控件,重写paintEvent,使用drawPixmap或者drawImage来绘制图片,这样效率会比使用QLbael有所提高,也可以实现与QLabel一样的setPixmap()效果。在Qt开发中,经常会遇到显示图片的需求;QLabel的setPixmap方法是一个非常简单易用的方法,可以快速地将图片显示在界面上。的图片,并且不需要进行太多的自定义操作,那么这种方式可能是最好的选择。
2023-08-31 15:20:09
833
原创 Qt事件处理流程
Qt事件处理Qt的事件处理大概大概可以分为四个步骤:事件派发 ->事件过滤 ->事件分发 ->事件处理事件派发:事件派发 是由Qt框架(QApplication 对象)来完成的,它将当前应用程序产生的事件派发给对应的窗口事件过滤:事件在到达对应的窗口之前,可以被其他对象过滤、拦截、处理事件分发:每个窗口都会有一个事件分发器,事件分发器会对时间进行分类,再将分好类的事件分发给对应的事件处理函数进行处理,每个事件处理函数的功能其实是非常单一的,只处理当前这一类事
2022-05-14 21:39:15
1676
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人