自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1904)
  • 问答 (2)
  • 收藏
  • 关注

转载 Qt 出现“undefined reference to `vtable for”原因总结

qmake不会处理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文件,再包含到.cpp里面去,才能解决这个问题.知道你的问题了, 上面的例子不好, 因为你这个把main和类放在一起了。所以, 我估计你前面提到的问题也是没有链接 moc 文件。qt的make编译是根据Makefile来的,而Makefile是由pro文件来的。

2025-05-29 17:21:33 35

转载 【笔记】QT坐标转换(QTransform 类)

返回此矩阵的逆矩阵,若矩阵是奇异的(非可逆的),则返回的矩阵是单位矩阵,若参数invertible 有效(即不为 0),则若矩阵可逆,则将其设置为 true,否则将其设置为 false。设置世界变换矩阵,若 combine 为 true,则把当前矩阵与 transform 组合,否则 transform会取代当前矩阵。若矩阵表示的是仿射(affine)变换,则返回 true,否则返回 false。把此矩阵作为仿射矩阵返回,注意:若为透视转换,则转换后将导致数据丢失。若矩阵表示缩放变换,则返回 true。

2025-05-29 15:10:03 13

转载 Qt开发技术:Qt绘图系统(二)QPainter详解

QPainter类在窗口和其他绘制设备上执行低级绘制。QPainter提供高度优化的功能来完成大多数图形用户界面程序所需的工作。它能画出从简单线条到复杂形状如饼图和弦等一切图形。它还可以绘制对齐的文本和像素图。通常,它绘制一个“自然”坐标系,但它也可以进行视图和世界变换。QPainter可以对继承QPaintDevice类的任何对象进行操作。QPainter的常见用法是在窗口的绘制事件中:构造和自定义(例如设置笔或画笔)绘制器。然后画。记住在绘制后销毁QPainer对象。

2025-05-29 13:06:34 11

转载 Qt Soem电机控制技术细节:深入代码与硬件交互

随着自动化技术的发展,电机控制在工业领域变得日益重要。本文详细介绍了Qt Soem电机控制技术,从基础理论到实践技巧,再到高级应用和案例分析,系统地阐述了电机控制的关键技术和实施方法。文中首先概述了Qt Soem电机控制技术,随后深入探讨了电机控制的基础理论,包括电机控制原理和控制算法,以及Qt与硬件通信协议,特别是Soem协议的介绍和Qt网络通信机制的实现。实践中,文章提供了硬件接口编程和Qt Soem电机控制代码实现的技巧,并着重于实时性能优化。

2025-05-25 23:32:02 27

转载 Qt/C++ Qt状态机框架(QStateMachine)的简明指南

本篇博文主要参考原文,并增加了自己实践过程中的理解。下面就直奔主题。Qt状态机框架提供了创建和执行状态图的类。概念和符号基于Harel的状态图,这也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)。状态图提供了一种图形化的方式来模拟系统对刺激的反应。这是通过定义系统可能处于的状态,以及系统如何从一个状态转移到另一个状态(状态之间的转换)来实现的。事件驱动系统(如Qt应用程序)的一个关键特征是,行为通常不仅依赖于上一个或当前事件,还依赖于之前的事件。有了状态图,这些信息很容易表达。

2025-05-25 23:06:00 43

转载 Qt状态机框架介绍(一)

状态机,简写为FSM(Finite State Machine),状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。简单来说,状态机,就是负责执行各种状态的切换。Qt状态机的使用场景主要针对比较复杂的界面,或者需要切换不同状态的控件,比如三态按钮,每个状态对应不同的样式,如果自己做状态管理,那就比较麻烦了。

2025-05-25 23:02:12 45

转载 Qt状态机框架——如何避免状态爆炸

前几节讲述了如何在Qt状态机框架下如何建立一个状态机,如何迁移状态,如何中断状态机,如何分组状态。考虑这样一个例子:有两个状态迁移能够退出并行状态,当这两个条件同时为真是,这个状态迁移中的第二个将不会起作用,因为第一个条件已经触发退出了并行状态,第二个迁移不会被处理。我们上每个独立的属性单独作为一个状态分组,状态分组维护自己的子状态迁移,这样即使属性增加,状态和状态迁移增加数量也是线性的,不会产生爆炸的结果,状态如类似于下面这样:;然后如果其中一个子状态退出并行状态,那么所有子状态都会退出。

2025-05-25 23:00:42 13

转载 QScrollBar详解

是 Qt 框架中用于实现滚动条功能的控件,分为水平滚动条()和垂直滚动条()。它通常与可滚动区域(如 、 或自定义视图)结合使用,允许用户通过拖动或点击操作滚动内容。以下是 的详细解析: 通过继承 并重写以下方法,可以实现更复杂的自定义: 在自定义滚动区域中,通常通过 的 和 方法管理滚动条,并重写 处理滚动逻辑。通过合理使用 ,可以显著提升用户界面的交互体验。结合样式表和子类化,几乎可以实现任何视觉效果的滚动条设计。 是 Qt 框架中

2025-05-25 22:57:55 14

转载 qt -- QScrollBar滚动条

QScrollBar提供了垂直或水平滚动条。滚动条通常配有其他控件,使导航更加精确。

2025-05-25 22:48:32 15

转载 【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角

在深入探究 Qt 的事件机制之前,了解其基本框架和核心概念至关重要。这不仅有助于我们理解 Qt 应用程序的行为方式,而且能够揭示其背后的设计哲学。正如计算机科学家 Donald Knuth 所指出的,“优良的设计在于深层的理解,而不仅仅是表面的饰物。事件机制(Event Mechanism)在 Qt 中指的是一种处理和响应系统或用户产生事件的方式。这些事件可以是用户的鼠标点击、按键输入,也可以是系统级的信号,比如定时器超时或网络数据到达。

2025-05-25 22:45:42 35

转载 开源项目推荐:OpenGL/Vulkan/Cairo/Skia/angle/VTK/OpenVG/MyPaint/GIMP/Krita/Pencil2D/inkspace/enve等绘图库或画图软件

Windows环境下二维绘图引擎有多种选择:GDI、GDI+、DirectDraw、Qt/QPainter、Agg、Cairo、skia、Direct2D、Direct3D、OpenGL、Vulkan等。GDI:微软原生的二维绘图引擎。优点:微软的全力支持,作为操作系统核心层效率方面不用担心,支持多种开发框架(含语言):WinSDK、MFC、Delphi等。缺点:不是面向C++对象组织的,使用起来较为繁琐;不支持反锯齿,不支持复杂的绘图效果(这个相对于GDI+而言)。

2025-05-25 18:07:02 28

转载 Qt 之图形(QPainterPath)

QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。QPainterPath 可以被填充、描绘轮廓、裁剪。要为一个指定的绘图路径生成可填充的轮廓,可以使用 QPainterPathStroker 类。

2025-05-25 18:04:33 16

转载 Qt:47---QPainter绘图之坐标转换函数、视口和窗口

当图形移动之后,坐标原点会随着动态变化,见下面的各个案例。

2025-05-25 17:39:35 10

转载 Qt信号与槽使用方法最完整总结

补充一点,信号和槽之间不是一一对应的关系。在Qt 5版本的connect 函数里,信号与槽函数的参数其实都是函数指针,当信号或槽函数有重载时,使用函数指针可以明确告诉编译器使用哪一个重载函数,避免歧义。信号灯就是发送信号的对象,绿灯亮是它发送的信号 (signal),汽车是接收对象,汽车行驶是汽车对信号的响应,也叫槽 (slot)。再举一个例子,比如在一个主窗口内有一个关闭按钮,如果点击这个按钮窗口就会关闭,那么关闭按钮是发送信号的对象,它发送的信号是点击,接收信号的对象是窗口,响应信号的槽是关闭窗口。

2025-05-24 14:23:36 20

转载 QT信号与槽的6种连接方式以及传递参数为自定义参数时

其次在信号端发射的信号类型应该是QVariant,QVariant是多种类型的联合,QVariant类中有个SetValue(T& value)方法,将自定义 T 类型的数据保存到QVariant对象中,可以理解为是自定义类型被封装成了QVariant的形式,这样,我们自定义的T类型的对象就能够通过所有参数和返回值为QVarian类型传递。与默认工作方式相同,只是不能重复连接相同的信号和槽,因为如果重复连接就会导致一个信号发出,对应槽函数就会执行多次。当信号发送后,相应的槽函数将立即被调用。

2025-05-24 14:22:01 84

转载 Qt Creator打造VScode one dark pro主题配色

最后附上配色方案的链接地址:vscode 配色方案地址Qt Creator打造VScode one dark pro主题配色_qt仿vscode主题-CSDN博客。

2025-05-24 14:04:19 28

转载 linux segfault at 问题定位实践

消息的最后一部分提供有关崩溃原因的其他信息。总体而言,此错误消息提供了一些用于调试崩溃的有用信息,包括发生故障的内存地址和指令指针、分段错误的类型以及发生崩溃时正在使用的共享库的名称和位置。生成独立的文件,用编辑工具打开来查看对应的1913c是属于哪一个函数,然后打开源码进行对应,定位是哪一个函数的哪一行出现的问题。bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址。这里仅仅使用了ip和so的基地址,其他的内存和sp地址信息暂未使用。

2025-05-19 21:25:59 31

转载 段错误(SegFault)的9种实用调试方法

在Linux系统中,程序访问非法地址时,会被CPU捕获后触发硬件异常处理机制,并通知Linux kernel程序运行出现异常,kernel会对各种异常进行区分,然后向应用程序发送不同的signal,由应用程序自己进行故障恢复处理。可以从中得到触发异常的指令地址和被访问的内存地址,然后利用系统中现有的一些工具进行调试,如利用objdump对可执行文件进行反汇编,然后从汇编代码入手进行分析,限于篇幅,不再展开讨论,后续会有专门文章详细讲解。但是有时候,由于某种原因,系统可能无法生存core dump文件。

2025-05-19 21:25:05 71

转载 QT QTreeView\QTreeWidget控件 使用详解

本文详细的介绍了、QTreeWidget控件的各种操作,例如:新建界面、控件布局、设置列、设置宽高、设置列表头、设置复选框、设置图标、添加树、删除树、查找树、修改树、设置选中、树排序、事件、信号、槽函数、添加节点、默认选中、.h源文件、cpp源文件、其它文章等等操作。实际开发中,一个界面上可能包含十几个控件,手动调整它们的位置既费时又费力。布局管理器可以完成两件事:自动调整控件的位置,包括控件之间的间距、对齐等;当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。

2025-05-17 10:41:07 63

转载 史上最全的QMap遍历方式

使用C++11的for循环遍历和std::for_each遍历QMap的方式最为常用和简洁,效率也比较高,占用资源较少。但是,不同的遍历方式适用于不同的场景,需要根据具体情况选择合适的遍历方式。如果需要修改QMap中的元素,应该使用迭代器进行遍历。如果只需要读取QMap中的元素,可以使用const迭代器或者C++11的for循环遍历。史上最全的QMap遍历方式-CSDN博客。

2025-05-17 10:39:16 59

转载 最全常用正则表达式大全

18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

2025-05-17 10:36:22 94

转载 muduo库的EpollPoller剖析

当某个客端,比如TCPConnection,或者我们自己写的代码调用Channel的enableReading()函数,就会引发Channel的Update()函数的调用,然后会调用EventLoop的UpdateChannel()函数,实际上会调用到Poller的updateChannel()函数。比如采用EpollPoller,那就会将事件注册到epoll的内核事件表中去,然后开启epoll_wait(),就是我们正常的e'poll流程了。如图,EventLoop调用poll()是上面事件注册的过程。

2025-05-12 19:09:51 40

转载 [muduo网络库]——muduo库三大核心组件之 Poller/EpollPoller类(剖析muduo网络库核心部分、设计思想)

[muduo网络库]——muduo库三大核心组件之 Poller/EpollPoller类(剖析muduo网络库核心部分、设计思想)_muduo网络库组成-CSDN博客

2025-05-12 19:05:44 38

转载 Muduo源码Poller类 + EpollPoller类详解

Poller class 是IO multiplexing的封装。在muduo中它是一个抽象类,因为muduo同时支持poll和epoll两种IO multiplexing机制。Poller是EventLoop的间接成员,只供其owner EventLoop在IO线程中调用,因此无需加锁。其生命周期和EvenLoop相等。Poller并不拥有Channel,Channel在析构前必须自己unregister(EventLoop::removeChannel()),避免悬空指针。

2025-05-12 19:04:44 33

转载 多线程(九)并发工具

跑道起点就相当于“barrier”,是临界点,而这6个运动员就类比成线程的话,就是这6个线程都必须到达指定点了,意味着凑齐了一波,然后才能继续执行,否则每个线程都得阻塞等待,直至凑齐一波即可。根据输出结果进行分析,Semaphore允许的最大许可数为5,也就是允许的最大并发执行的线程个数为5,可以看出,前5个线程(前5个学生)先获取到笔,然后填写表格,而6-10这5个线程,由于获取不到许可,只能阻塞等待。这里的6个线程,也就是计数器的初始值6,是通过CyclicBarrier的构造方法传入的。

2025-05-12 19:02:57 27

转载 什么是Dao层、Entity层、Service层、Servlet层、Utils层?

在最近的学习实训中,新做了一个项目,里面用到了许多层次架构,目前还不太懂,在查过资料后记录一下笔记,以便后续的回忆复习。以上就是今天要学习的内容,以便后续的复习回顾,也希望对你有帮助!什么是Dao层、Entity层、Service层、Servlet层、Utils层?-CSDN博客。

2025-05-12 18:58:47 167

转载 后端中的Dao层、Service层、Impl层、utils层、Controller层

Javadao层叫,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,对外提供稳定访问数据库的方法访问数据库,对数据库进行操作,提供接口给Service层当sql语句发生变化更改时,我们可以只修改对应的XML文件,而无需再修改Mapper,这样每次更改sql语句时,代码就可以不用再次重新编译!直接与数据库打交道(执行SQL语句),接口提供给service层。

2025-05-12 18:57:53 242

转载 pread与pwrite使用

在阅读seastar源码时发现有使用pread函数,这也是第一次认识pread函数,平时用read比较多。

2025-05-12 18:56:45 19

转载 Linux系统函数read()/write()/pread()/pwrite()的区别

在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜鸟们束手无策。先来看看都有哪些函数,通过解析与总结,看看能不能让大家能这些函数有个理性的认识,哦,原来是这么回事,也就算我没白花这份闲。内核文件I/O->标准库I/O->高级I/O->IPC中1. read()/write();2. pread()/pwrite();3. getc()/putc();4. fgetc()/fputc();5. getcha

2025-05-12 18:55:27 33

转载 QPainter、QPen、QBrush,绘图、填充、渐变等使用方法

QPen是画笔,用来绘制图形的轮廓线,以及定义轮廓线的颜色、样式和属性;QBrush是画刷,用来填充封闭图形,以及定义填充的颜色、样式和属性;QPainter是画家,他要使用画笔QPen和画刷QBrush,在画布()上画文字、图形、图片等。可以充当画布()的类(其子类)有:QWidget,, and。这么多类型的画布中,和最常用。

2025-05-12 18:51:51 26

转载 内存分配函数malloc、realloc、calloc、_alloca

如果空间不够,先按照newsize指定的大小分配其他空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。缩小时,被缩小的那一部分的内容会丢失。扩大时,realloc会向堆中现存的数据后申请需扩大的内存,若成功,则返回地址与原首地址相同;若内存空间不够,则选取堆中足够大小的自由块,将原有数据依次拷贝到新地址,并释放原来所使用内存区域(系统自动释放),同时返回新分配的内存区域的首地址。

2025-05-10 11:18:21 54

转载 Unix/Linux编程:在堆栈上分配内存------alloca()

和 malloc 函数包中的函数功能一样,alloca()也可以动态分配内存,不过不是从堆上分配内存,而是通过。根据定义,当前调用函数的栈帧位于堆栈的顶部,故而这种方法是可行的。因此,帧的上方存在扩展空间,只需修改堆栈指针值即可参数 size 指定在堆栈上分配的字节数。函数 alloca()将指向已分配内存块的指针作为其返回值。不需要(实际上也绝不能)调用 free()来释放由 alloca()分配的内存。同样,也不可能调用 realloc()来调整由 alloca()分配的内存大小。

2025-05-10 11:17:13 38

转载 基于栈的内存非配--alloca函数

alloca是一个在 C 和 C++ 中可用的函数,用于在栈上动态分配内存空间。它类似于malloc函数,但是分配的内存空间在函数返回后会自动释放,无需显式调用free函数。以下是alloca函数的详细介绍:size:要分配的内存空间的大小,以字节为单位。alloca函数返回一个指向分配的内存空间的指针。如果无法分配所需的内存空间,则函数的行为是未定义的。alloca函数在栈上分配内存,因此分配的内存空间的生命周期与调用函数的栈帧绑定。一旦函数返回,分配的内存空间就会自动释放,无需手动释放。

2025-05-10 11:12:45 38

转载 关于名称重整(name mangling)、多态性的一些简单介绍

因此,你可以写多个方法,例如PrintInteger(int i)、PrintString(string s) 和 PrintFloat(float f),编译器自会准确调用特定的Print方法。如此,当你调用Print(1)的时候, 编译器可能在内部用源于参数类型的前缀重命名Print方法,这样一来Print(1)可能就变成 i_Print (1)。每一个方法在VMT中都有一个索引, 如此当Print(int)被调用的时候,编译器将被路由到VMT处找寻Print方法和类的内在索引。

2025-04-30 14:03:45 103

转载 C++雾中风景15:聊聊让人抓狂的Name Mangling

在进行编程的过程之中,我们常常遇见变量或函数重名的情况。函数的重载,或通过不同程序块与命名空间变量与函数的重名。而在出现变量或函数名相同的情况下,编译器进行代码编译时需要保证变量与函数的签名的全局唯一性。如果无法进行上述保证,在链接阶段就会产生链接的二义性,会导致编译器不知道应该如何取用正确的变量与函数符号的内存地址。为了解决上述问题,编译器实现了一种叫做它通过一个固定的命名规则来重新组织源代码之中我们定义的变量名和函数名,来确保了能够将被链接的目标文件中的符号签名的唯一性。

2025-04-30 14:01:59 103

转载 C++函数重载的实现机制之name mangling

前一期【】讲解了基于实现的动态多态,并且深入剖析了动态绑定在编译期、执行期各自完成的任务。本期继续讲解基于函数重载实现的。

2025-04-30 14:01:05 85

原创 name mangling翻译名称

网上能查到的翻译:命名倾轧名字修饰名字改写。

2025-04-30 13:59:45 142

转载 CountDownLatch详解以及用法示例

CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

2025-04-27 16:01:51 278

转载 stl中uninitialized_copy、uninitialized_fill、uninitialized_fill_n剖析

如果 [first, first+n) 范围内的每一个迭代器都指向未初始化的内存,那么 uninitialized_fill_n() 会呼叫 copy constructor,在该范围内产生 x(上式 第三参数)的复制品。uninitialized_fill()也能够使我们将记忆体配置与物件的建构行为分离开来。换句话说,针对输入范围内的每一个迭代器 i,此函式会呼叫 construct(&*(result+(i-first)),*i) ,产 生 *i 的 复制 品, 放置 于 输出范围的相对位置上。

2025-04-15 19:36:44 80

转载 SGI STL内存基本处理工具:uninitialized_copy/uninitialized_fill/uninitialized_fill_n

目录。

2025-04-15 19:11:32 92

空空如也

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

TA关注的人

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