自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

liulun的博客

风雪夜归人

  • 博客(129)
  • 资源 (2)
  • 收藏
  • 关注

原创 Qt5.x升级6.x应注意http请求头大小写的问题

在Qt中发起HTTP请求时,Qt 5.x和Qt 6.x在处理请求头时存在差异。Qt 5.x会原封不动地发送开发者设置的请求头,而Qt 6.x会将请求头的名称转换为小写后再发送。根据HTTP协议,请求头名称是不区分大小写的,且应默认统一为小写。Java后端在处理HTTP请求时,对请求头名称的大小写不敏感,而某些Python Web框架(如Flask)则对大小写敏感。目前,无法禁止Qt 6.x将请求头名称转换为小写,只能通过调整服务端代码来适配这一变化。

2025-05-23 11:28:22 337

原创 Skia如何在窗口上绘图

WM_PAINT消息 当系统需要重绘窗口时,会向窗口发送 WM_PAINT 消息, 比如窗口大小改变或应用程序内调用InvalidateRect系统API(强制重绘窗口)时,系统都会向窗口发送WM_PAINT 消息。窗口创建成功后,窗口的消息处理函数会陆续收到与窗口有关的消息,比如窗口大小调整消息(WM_SIZE), 窗口重绘消息(WM_PAINT)等。改变窗口大小会更新全局变量 w 和 h ,会触发窗口的重绘消息,会重新执行paint方法,重新创建像素数组,重新在窗口右下角绘制矩形。

2025-05-22 13:51:49 542

原创 桌面端截长图/滚动截图:图像融合拼接关键算法

文章摘要:本文介绍了在窗口滚动前后,通过图像处理技术实现图像拼接的关键步骤。首先,在滚动前后分别对窗口进行截图,然后通过OpenCV或自研算法找到两个子图像的相似区域。OpenCV算法通过模板匹配找到最佳匹配位置,而自研算法则利用多线程计算误差,找到最小误差的匹配区域。最终,通过确定相似区域的位置,实现两个图像的拼接。文章强调,不应通过计算鼠标滚轮滚动的高度来确定窗口内容的变化,因为不同窗口的行进高度可能不同。

2025-05-16 13:53:08 335

原创 Qt6.x检查网络是否在线(与Qt 5.x不同)

Qt 6.x.x 废弃了 QNetworkConfigurationManager,此时要判断客户端网络是否联通需要使用:QNetworkInformation。

2025-05-09 14:16:23 462

原创 C++ 如何在一个方法中返回多个不同类型的数据

int number;return 0;这种方法就更麻烦了,不过要返回很多数据时,这个方法能更清晰的表意。

2025-05-07 13:15:06 272

原创 【自荐】体积小,速度快,对开发、测试人员友好的截图软件

ScreenCapture 截图工具、仅一个可执行文件,无需安装,不依赖任何。运行速度快、内存占用低、CPU 使用率低。

2025-05-06 10:21:12 356

原创 使用zxing-cpp生成与识别二维码(支持中文)

使用zxing-cpp生成与识别二维码(支持中文)

2025-05-02 11:34:16 327

原创 Windows 遍历桌面上的窗口,得到窗口矩形(修正矩形间隙)

【代码】Windows 遍历桌面上的窗口,得到窗口矩形(修正矩形间隙)

2025-04-18 14:31:11 129

原创 Qt 仅绘制半个像素的边框(现象及解决方案)

也就是说,你必须明确告诉Qt,你想绘制0.5像素的边框,而且你绘制的内容会在你的画布上。边框粗细也会跟着变大,但虽然设置的边框粗细是6,实际看到的也只有3个像素的宽度。虽然我们设置了边框粗细为1像素,但实际上绘制的这个矩形的边框只有0.5像素。你仔细看的话,会发现上图右侧边框已变得粗一些了。这是无论你怎么拖动改变窗口大小,边框也不会消失。这个现象其实很容易理解,我就不总结了。(并不是所有时候都会被忽略)当我们把边框粗细调大。

2025-04-11 14:52:46 174

原创 把一个半透明窗口嵌入Windows桌面并转发系统鼠标消息到窗口

当窗口嵌入桌面时,Qt的事件处理机制是接不到鼠标消息的,你只能在onEmbed....方法中手动处理。现在这个窗口的所有消息都会被转发到 WNDPROC oldProc;把窗口从嵌入状态恢复为非嵌入状态,最简单的办法就是把这个窗口关了,重新创建一个。当窗口未嵌入桌面时,不应该注册输入设备。窗口在桌面背景前面,在桌面图标后面。

2025-04-10 08:27:00 195

原创 Windows注册鼠标钩子,获取用户选中的文本

上述代码中MouseProc方法用于处理系统的鼠标消息。

2025-04-07 17:14:35 523

原创 Qt在高分屏下播放gif动画模糊问题的解决方案(支持gif缩放)

然而用这种方案在高分屏下播放 gif 动画会导致动画模糊。

2025-04-01 09:27:34 213

原创 轻量级 Qt无边框、带阴影、可变大小窗口方案(Windows)

这个消息主要是用于让窗口聚焦,不然 在最小化窗口后再通过点击任务栏,显示窗口,此时鼠标移入 setSystemButton 设置的组件(自定义 QWidget ),无法触发此组件的 enterEvent。这段代码用于设置窗口位置、大小,并显示窗口,注意,必须等设置完阴影效果,移除边框之后,才能设置窗口大小并显示。这段代码用于设置窗口最大化的尺寸,避免窗口最大化时,把任务栏都盖住了。这段代码鼠标双击自定义标题栏区域时,切换窗口最大化,最小化的状态。这段代码用于在窗口最大化状态切换时改变最大化按钮图标。

2025-03-28 11:40:06 393 4

原创 Qt窗口最大化后无法还原的问题及解决方案

这是 Qt 在无边框窗口 (Qt::FramelessWindowHint) 下的一个已知问题。无边框窗口在 showMaximized() 后,由于缺少标准的窗口管理机制,Qt 无法正确地恢复窗口大小。此方案原理就是把窗口的FramelessWindowHint属性拿掉,再改变窗口的大小,再把FramelessWindowHint窗口属性加回去。值得注意的是,setWindowFlags() 之后需要 show() 以应用更改,否则窗口可能不会更新。都不能改变窗口的大小。

2025-03-26 12:31:45 185

原创 Qt把图像写入剪切板会导致内存泄漏的解决方案

Qt把图像写入剪切板会导致内存泄漏的解决方案

2025-03-21 11:07:12 150

原创 系统API得到的屏幕坐标与Qt得到的屏幕坐标不一致,怎么办?

在获取鼠标屏幕坐标时,系统API和Qt API在高分屏下会得到不一致的结果,因为Qt的坐标考虑了屏幕缩放比例。系统API使用GetCursorPos获取坐标,而Qt使用QCursor::pos。为了将系统坐标转换为Qt坐标,可以使用getQtPoint函数,该函数通过MonitorFromPoint和GetDpiForMonitor获取屏幕的DPI缩放比例,并将系统坐标除以缩放比例得到Qt坐标。然而,如果坐标不在屏幕上,转换可能会出现问题。

2025-03-19 14:51:55 211

原创 Qt跨屏窗口的另一个解决方案

前面我写了一篇文章:《Qt跨屏窗口的一个Bug及解决方案》,里面提到了一个用QImage做画布的方案。必须这样做,才能让窗口真正的覆盖用户的整个桌面(覆盖所有屏幕)。第二步,使用Qt API设置窗口位置和大小,并显示窗口。第一步,用系统API得到整个跨屏桌面的位置和大小。第三步,再使用系统API设置一遍窗口的位置和大小。

2025-03-17 14:05:11 160

原创 Qt把字符串转型为字体图标的编码,并绘制字体图标

但有的时候字体图标的编码是放到数据库里的,此时就得考虑把字符串转型为QChar再绘制图标。上图中16进制的Unicode就是图标的编码,绘制图标的代码如下。绘制字体图标,只要得到图标在字体里的编码,就可以直接绘制。

2025-03-10 11:51:44 242

原创 在QImage和QPixmap上绘图,哪个快?快多少?

在QPixmap上绘图时间(30毫秒左右)大概是在QImage上绘图时间(45毫秒左右)的65%左右。多次测试得出结论:在QPixmap上绘图更快。测试环境:Qt 6.8.2,OS Win10。

2025-03-06 08:26:26 108

原创 Windows窗口程序向控制台输出信息的两种方案

用户双击exe时,除了打开程序窗口外,你还希望打开一个控制台窗口,用于输出调试信息。AllocConsole方法负责创建一个Console窗口。

2025-03-01 13:49:01 286

原创 使用系统API播放在线视频,编译产物15kb

【代码】使用系统API播放在线视频,编译产物15kb。

2025-02-25 13:52:00 230

原创 Skia如何在图像文件上绘图

从本文开始,我将正式使用 Skia 库绘图。本章先介绍了如何使用本系列文章的源码库(以后所有章节的源码都是按照这个方式使用的)。随后介绍了如何在一个图像文件文件中绘制一个简单的矩形。由于是第一次使用 Skia 库绘图,所以本节介绍会详细一些,希望大家能顺利入门。

2025-02-24 15:23:55 674

原创 不依赖GLFW或Glad创建Skia OpenGL后端(Windows)

这段代码中:sampleCount 表示多重采样抗锯齿的采样数。stencilBits 表示模板缓冲区的位深度。窗口大小改变时,我们释放了SkSurface对象,迫使程序去重新获取SkSurface。现在初始化hglrc、grContext、backendContext和fbInfo。如下是我使用上述代码创建的一个半透明窗口,如你所见,资源消耗并不高。这很重要,关系到多屏幕用户环境的一个重要BUG。上述代码最后两句 dllexport。

2025-02-24 09:56:31 313

原创 如何使用Windows API让窗口显示输入光标以及相关问题

在调用ShowCaret方法之后,光标一般会闪烁6次,6次之后就不会再闪烁了,要想让它再次闪烁,必须再次调用ShowCaret方法,这个行为与Windows自带的记事本的行文一致。但如果你的窗口颜色是自绘上去的,系统可能算不出光标的颜色,此时可能就会用一个默认颜色来设置光标颜色(往往是白色)创建的光标的颜色由系统决定,一般会使用一个与窗口背景颜色对比度高的颜色。创建输入光标的代码(第三个参数为光标宽度,第四个参数为光标高度)。要想改变这个行为,就必须得自绘光标。

2025-02-20 16:26:05 213

原创 Qt跨屏窗口的一个Bug及解决方案

如果是 Qt Quick 窗口,那么就要用 QQuickRenderControl 来把QML内容渲染到原生窗口中了,代码过于复杂,这里就不贴了,详情请参考:https://doc.qt.io/qt-6/qquickrendercontrol.html。如果我们希望一个窗口覆盖用户的整个桌面,此时就要考虑用户有多个屏幕的场景(此窗口要横跨多个屏幕),由于每个屏幕的分辨率和缩放比例可能是不同的,Qt底层在为此窗口设置缩放比例(DevicePixelRatio)时出了问题。屏幕A:缩放比例:100%

2025-02-04 12:08:55 765

原创 Avalonia与QtQuick的简单对比

这个是Avalonia开发的示例应用程序(官方入门示例)(Avalonia 11.1.0 .Net 9.0)这个是Qt Quick开发的示例应用程序(官方入门示例)(Qt 6.8.0)两类应用程序都有使用GPU的能力(这方面感觉Avalonia更好一些)。启动前后内存占用基本相同,都是32M左右,空闲状态下,CPU无消耗。,CPU占用一直都在,我i9-13900HX的CPU,它消耗我大概 0.1% 的CPU资源。刚启动时,内存占用150M左右。内存占用降低到77M左右。

2025-02-01 19:57:45 298

原创 类Node.js开源项目(最后一个鲜为人知)

首先,这个项目是遵循WinterTC (TC55)规范开发的(https://wintercg.org/),这套规范规定了一组API,约定了实现跨服务器端JavaScript运行时的能力(参见:https://min-common-api.proposal.wintercg.org/#api-index)。(https://github.com/quickjs-ng/quickjs)创建,注意,这个QuickJS项目是真正的QuickJS项目的一个分支,我们之前介绍过这个分支(翻翻历史文章吧)。

2025-01-28 16:59:17 962

原创 Skia使用Dawn后端在Windows窗口中绘图

然后创建Dawn表面(注意,dawnSurface不是Skia的SkSurface)目前我还没找到好得解决办法,希望懂的老师不吝赐教,必有重谢。然后配置Dawn表面(改变窗口大小时,也得调用这个方法)每次绘图都要重新获取Skia的Surface。然后创建绘图上下文和Recorder。最后把绘图内容同步到窗口中。

2025-01-24 16:09:17 476

原创 简介:编译、链接、静态库那点事儿

最终产物只有 main.exe,开发者可以仅把 main.exe 分发给程序的最终使用者,不需要再携带你的 youStaticLib.lib 静态库文件,你的静态库youStaticLib.lib 已经成为了 main.exe 的一部分。,工程有 A,B,C 三个文件,第一次编译时生成了a.obj,b.obj,c.obj 三个文件,当用户改动了 C 文件后,再次编译工程,此时只需要重新生成 c.obj 就可以了。当然,如果你工程庞大,项目文件众多,那就不可能在命令行下输入这么多文件名。

2025-01-23 15:19:04 766

原创 我喜欢和不喜欢的C++特点

我不太喜欢别人管着我,因为事情做的好不好是我自己的事,如果我的工具担心我做不好事,就给我灌输一大堆原则、理念,骑在我脖子上,这也不让我做,那也不让我做,必须如何如何做才行……我很少用vcpkg、Conan这样的库管理工具,用到什么库都是自己编译,但编译时用到的工具也不统一,像CMake、GN、Ninja、Meson等等。我喜欢面向对象和函数式编程,我的代码中这两种编程风格融合的很好,很多库开发者喜欢泛型编程和元编程,还有一些老代码是遵循面向过程编程的。C++之父的《C++语言的设计与演化》。

2025-01-22 10:44:03 269

原创 Windows截获系统鼠标消息转发到指定窗口

这个对象的ulButtons属性的值代表着鼠标消息的其他类型,比如鼠标左键按下:RI_MOUSE_LEFT_BUTTON_DOWN,鼠标左键弹起:RI_MOUSE_LEFT_BUTTON_UP等。dwFlags属性的值为RIDEV_INPUTSINK,表示原始输入设备的输入将发送到指定的目标窗口,而不是默认的窗口。如果窗口是你自己的,此时你就可以执行具体的方法了,如果窗口不是你自己的,你还可以把这些消息发送给目标窗口。dwFlags属性的值为HID_USAGE_GENERIC_MOUSE,表示鼠标设备。

2025-01-19 10:22:50 504

原创 C++给屏幕拍照的两种办法(兼容多屏幕)

上面代码执行后,屏幕图像的像素数据存储在 pixSrcData 中。这种方法得到的屏幕图像存储在一个QImage对象中(img)每个像素以4个位组成,分别为:r,g,b,a。两种方法都能给包含多个屏幕的桌面拍照。使用Windows API拍照。使用Qt API给屏幕拍照。

2025-01-16 11:00:24 230

原创 编译并使用QuickJS(C++项目)

这个方法的第一个参数是这个JS方法的运行上下文,第二个参数是执行当前方法的JS对象,第三个参数是这个JS方法的参数数量,第四个参数是这个JS方法的参数数组。我们知道JavaScript在浏览器或Node.js里运行时,都有一些全局对象,比如:window,console等。JSContext是JavaScript脚本的运行上下文对象,它负责管理脚本执行相关的所有状态及作用域,,具体怎么在项目中用这个库,我就不多介绍了,下面介绍一下怎么在C++项目中使用QuickJS。编译成功之后,你会得到qjs.lib。

2025-01-15 09:22:24 526

原创 C++使用curl收发WebSocket消息

curl_easy_init 函数通常用于创建一个的 CURL 句柄,然后为该句柄设置各种选项(如 URL、请求方法、请求头等),并执行 HTTP 请求。curl_multi_add_handle用于将一个CURL句柄添加到多重CURL句柄中,以便并发地执行多个请求。curl_multi_init用于初始化一个多重CURL句柄,以便于同时处理多个请求(这是多线程的关键)。curl_ws_meta方法用于得到一帧数据,这可能并不是一个完整的WebSocket消息。CURLOPT_URL用于配置服务端地址。

2025-01-14 08:15:30 362

原创 Node.js新草案:通过共享库使用Node.js

我们知道,应用程序的主线程只能有一个消息循环,要想合并前面提到的两个循环,一个常见的办法是把通过一个非常小的时间间隔,把一个消息循环的消息,泵入另一个消息循环,但这样做会导致导致GUI界面响应缓慢或占用大量CPU资源。Electron的做法是这样的:创建了一个单独的线程并使用使用系统调用来轮询libuv的fd,以获得libuv的消息,得到libuv的消息后,再把消息交给GUI主线程,由主线程的消息循环处理libuv的消息。不过,这种做法显然是要修改Node.js的源码的(修改的不算多)

2025-01-13 11:56:15 371

原创 漫谈史上最强Skia 2D渲染引擎(少谈优点,多谈缺点)

Ganesh和Graphite是两组技术,Ganesh更老更稳定,Graphite更新、更快(多线程支持更好)、更不稳定,但它是趋势,是Skia团队的主攻方向。由于要使用动态库的函数指针,所以这个后端会让你的应用程序多出两个动态库:libEGL.dll,libGLESv2.dll,大概20M,裁剪不掉,还没办法静态链接。如果你看到Direct3D,眼前一亮,心想,别的都不用看了,我要的就是这个,我只要搞Windows应用,其他肯定都没这个好。我建议别选最新的,也别选太老的,我一般选半年内,1个月前的版本。

2025-01-11 11:43:04 3606 2

原创 Qt大图像马赛克方案:又快又准又简单

使用Qt::SmoothTransformation缩小大图像,Qt框架会帮我们计算好小图像上每个像素的颜色(也就是说,为每个马赛克格子取平均颜色的工作交给了Qt框架)。如你所见,方案足够简单,在我的电脑上(i9,48G)处理2560*1440的图像,大概30ms左右,执行效率也不错!(马赛克格子越大,效率越高)。使用平滑算法把大图像缩小成一个小图像,小图像上每一个像素就是一个马赛克格子的填充像素;得到每个小矩形内的所有像素的颜色,然后计算这些颜色的平均值。用小图像上的像素颜色填充大图像上的马赛克格子;

2025-01-10 08:09:28 215

原创 Windows半透明窗口的三个方案及其优缺点

如果你不考虑任何性能问题,那么使用WS_EX_LAYERED样式创建透明窗口,无疑是最简单的方式。在这段代码中,我们把img图像里的像素数据渲染到窗口上了。我代码里写了注释,这里就不多做解释了(示例仓储里的代码用的是Blend2D,想搞Qt的QImage你可以问我,看本文最后)。这样的窗口有四个性能上的问题:它用不到GPU硬件加速的能力,所有绘制操作都是在CPU和内存中完成的。CPU要为这类窗口执行命中测试的工作(鼠标移动就会检测,就会产生CPU消耗)。

2025-01-08 08:37:26 1298

原创 历时8年开发,FLTK发布新版本1.4.0

编译并链接到FLTK库的程序如果在运行时可用Wayland,则使用Wayland,如果Wayland不可用,则退回到X11。FLTK提供的一些组件样式都比较刻板,绘图API也比较少(你想实现一个漂亮一点的圆角按钮[它内置圆角按钮的圆角大小是不能改的],必须自己画,而且还得借助一些非常奇葩的手段才行)。它不像Qt那样给开发者提供了很多辅助类,FLTK虽然提供了一些与界面无关的工具,但非常少,几乎可以忽略。它是C++开发的,但提供的API不够现代,C语言的味道挺浓的,不过用起来总体还算舒服的。

2025-01-08 08:12:45 458

原创 简介:Qt Quick图形引擎的底层原理

Qt 会尽可能使用目标平台的硬件接口,比如,在Windows平台上使用Direct3D,在Mac平台上使用Metal。QPainter 的优势是可以在渲染每一帧时完成成千上万次单独的绘制指令,而如果要让 OpenGL 和其他硬件接口的性能表现更好,则应尽可能减少硬件 API 的调用次数。当遍历每个元素的状态并生成下一帧的渲染指令时,Qt可能还在专门的渲染线程上渲染上一帧的内容(Qt会在这个环节丢弃某些不必要的帧),上图中,越上面的层次,越靠近操作系统/硬件,越下面的层次,越靠近用户。

2025-01-07 08:49:57 528

Electron包安装过程解析pdf

本文详细讲解了Electron依赖包被安装到项目中所经历的各个环节,并详细介绍了Electron依赖包对二进制可执行文件的缓存机制以及版本控制原则。

2020-10-27

ASP_NET服务器控件与组件开发

ASP_NET服务器控件与组件开发,说的很详细 有很好的模型图,外国人写的

2008-10-22

空空如也

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

TA关注的人

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