前言 ​ QT除了提供GUI上的一些组件,还提供了一些很好用的非GUI的库,有时候为了方便(主要是习惯了使用QT)需要将QT的一些类再次封装,提供给一个非QT GUI的工程使用。 ​ 如果不需要使用到QT的事件循环相关的功能,那使用起来跟其他的库没有什么区别。 ​ 但是QT很多类都提供了信号和槽,并且QT在封装的时候有些类是默认使用了事件循环的功能的,那么这个时候使用就需要注意一些问题。 QCoreAppLication 和QApplication 的区别 ​ QApplication是QCoreApplicati…

2023年6月20日 0条评论 1068点热度 0人点赞 大脸猫 阅读全文

前言 ​ QT中的信号(signal)与槽(slot)是非常好用的机制,简单来说就是声明两个函数,声明时使用特殊宏将函数声明为信号函数和槽函数,之后再使用connect()函数,将两个函数绑定在一起。做好了这些工作之后,调用信号函数就会触发槽函数的调用,又根据绑定时所传递的参数不同,分为直接触发、延迟触发,跨线程触发等。 信号与槽函数的简单使用 ​ 不废话,直接上代码 class SignalSlotTest:public QObject{ Q_OBJECT public: SignalSlotTest(QObje…

2023年6月16日 0条评论 1678点热度 0人点赞 大脸猫 阅读全文

前言 ​ 本篇博文主要针对一下几个问题展开讨论: QT_TR_NOOP和QT_TRANSLATE_NOOP 以及QObject::tr() 的区别。 正常加载.qm文件,但无法正常翻译字符。 没有继承QObject的类如何使用国际化功能 框架结构解析 .ts .qm文件 ​ .ts文件本质上是一个xml文件,它保存了以下信息: 需要翻译的字符串 字符串的上下文标记(context),一般是类名,也可以自定义 字符串所在文件,以及在文件中所在的行号 字符串被翻译之后的文本 ​ 其中1、2很重要,这里先按下不表。 ​ …

2023年5月9日 0条评论 2094点热度 1人点赞 大脸猫 阅读全文

前言 ​ 之前有在QTCreator中介绍怎么使用QT Linguist Tools怎么使用,最近在一个使用CMake的项目中需要用到多语言的支持,折腾了一下,遇到了比较多的问题,所以在这里分享一下。 ​ 在阅读这篇文章之前,也许你需要一些CMake的基础知识: ​ 使用CMake创建一个最简单的工程 ​ 在CMake中引入QT库 在工程中添加LinguistTools模块 ​ 这篇文章中以QT5为例,其他的QT版本可以参考QT官网的文档,思路都是一样的。 ​ 在CMake中使用以下代码查找Qt5LinguistT…

2023年5月8日 0条评论 2648点热度 0人点赞 大脸猫 阅读全文

前言 最近拿到一个电路绘制的需求,这我可太擅长了(不是),毕竟转行码代码之前就是画电路图的啊。需求与常用的电路绘制软件一致,就是将Toolbar上的电子元器件拖拽到画图上,然后玩一玩连连看,最后再将电路数据按照固定的格式输出即可。 做这种需求使用QGraphicsView那一套简直太舒服了,当然可能也有大佬选择用QPainter手搓。。。QGraphicsView提供了图元的各种操作,移动,旋转,放大缩小,并且QGraphicsView 有着专门对付这种场景的缓存机制和绘图机制,即使图元达到几千个也可以做到操作时不…

2022年10月19日 2条评论 3937点热度 3人点赞 大脸猫 阅读全文

前言 最近为便利贴小工具新增点击链接,然后自动在浏览器中打开,这样一个功能。最开始想的是只要在输入内容时自动识别链接,然后在fromat中将其设置为链接格式,QTextEdit应该会自动处理。而事实是QT并没有做到这一点所以只能自己实现这么一个功能。 功能 简单的实现鼠标点击QTextEdit中的链接,系统上的浏览器会自动访问。但是这里的点击会与QTextEdit中的插入冲突,所以要修改链接时,只能通过键盘的上下左右键,将光标移动到链接中需要修改的位置(这个似乎没有更好的解决办法)。 实现思路 在QTextEdit…

2022年6月2日 0条评论 3224点热度 3人点赞 大脸猫 阅读全文

前言 Qt 提供了QShortcut来实现快捷键的功能,不过它的响应范围只局限于窗口内。如果脱离了进程窗口,如在桌面,或者正在使用其他软件,是无法响应的。 要解决这样的问题可以使用Windows 提供的API再结合qt的一些功能来实现一个全局可响应的快捷键。 需要用到的技术 RegisterHotKey() 这是是一个winAPI函数,它的作用是像系统注册一个快捷键,注册成功后系统会根据全局的键盘输入来判断快捷键是否被触发,触发之后通过WinMessage的方式来通知注册者。 BOOL WINAPI Registe…

2022年6月2日 2条评论 5043点热度 5人点赞 大脸猫 阅读全文

前言 一般来说使用qt库,直接使用Qt Creator创建工程就可以了,或者使用Vs studio 中的qt tools也可以在vs中创建一个qt工程。 但大多数时候工程中依赖的第三方库,不止有qt,当依赖的第三方库比较多的情况下,直接使用Qt Creator或者是Vs studio 管理这些依赖不是一个明智的选择。 这个时候最好是使用CMake管理工程,CMake提供了良好的跨平台特性,对于第三方依赖的管理也要优雅许多。 QT 库本身就提供了对CMake的支持,在CMake中只需要简单的几行脚本就可以处理好对QT…

2022年4月24日 0条评论 7331点热度 7人点赞 大脸猫 阅读全文

在项目中遇到这么一个问题,在程序退出时,在某个QWidget的派生类的析构函数中,会抛出一个 XXX访问XXX出现冲突的异常,当时第一反应是对象被重复delete了,但经过一番查验,又与大佬讨论,发现事情的真相并不简单,遂记录,以供查阅。 异常抛出的位置是在一个单例的析构函数中,这个单例继承于QWidget。 在析构函数处设置断点,发现对象并没有被重复析构,这个时候我有点蒙圈了,于是写了一小段代码来复现这个问题。 class MyWidget :public QWidget { public: QWidget *w…

2022年4月14日 0条评论 2316点热度 4人点赞 大脸猫 阅读全文

前言 使用事件过滤器之前需要了解qt事件的运行机制。 这里举一个应用场景来记录事件过滤器的整个使用过程。 实现这样一个功能,在一个窗口上追踪鼠标的的移动位置,如果这个窗口是一个单一的窗口,没有任何子控件,那么只需要开启鼠标追踪,然后重写mouseMoveEvent(),就可以实现功能了。 但是如果有子控件的情况下,鼠标移动到子控件上时,移动事件会优先被子控件处理,那如果要在一个复杂的页面上完成这样的功能,岂不是需要重写所有子控件的鼠标事件? 事件过滤机制 Qt 在提供事件循环服务时,为了QObject提供了 boo…

2022年4月7日 0条评论 3516点热度 2人点赞 大脸猫 阅读全文