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

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

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

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

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

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

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

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

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

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

QThread 是Qt提供的一个线程类,要使用它实现多线程编程有两种方法,一种是新建一个QThread对象,然后使用QObject::moveToThread(QThread*),将一个QObject对象的事件循环转移到新的线程中。另一种是继承QThread类然后重新实现run()方法,run()将在调用QThread::start()的时候在新的线程中被调用。 这个函数可以将对象以及子对象的线程关联移动到targerThread中,但是这个对象不能有父对象,否则会失败。 如果targetThread 为nullp…

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

QT有几种可以实现多线程编程的方式,其中最方便使用,最便携的一定是QtConcurrent::run()了,这是一个模板函数,有很多的重载原型。 //在新的线程中调用普通函数 template <typename T> QFuture<T> QtConcurrent::run(Function function, ...) //使用线程池中的线程调用普通函数 template <typename T> QFuture<T> QtConcurrent::run(QThr…

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

QLocalSocket 是Qt提供的一个进程与进程之间的通信的方法,在Windows系统上使用管道技术实现。 翻阅了一下微软的MSDN得知管道技术是通过共享内存实现的,创建管道的进程称为pipe server,连接的被称为pipe client,当一个进程往管道中写入信息后,另一个进程就可以在这个管道中读取信息。 扯远了,文章主要记录QLocalServer和QLocalSocket如何使用,然后在实现进程通信的基础上,实现一个程序保证在系统里只有一个实例在运行。 使用QLocalServer 时,先调用list…

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

便利贴页面: 历史记录页面:   老实说Windows自带的便笺还挺好用的,但是已经很久不更新了,都2022了都还不能置顶到屏幕上,很难受。而且部分富文本功能也很不友好,所以决定自己撸一个。 之前一直用的windows自带的便笺,UI和一些交互非常喜欢,所以就照抄了,本着把喜欢的都拿过来,然后再加一些它没有的东西。 新建便利贴 程序运行后会最小化到托盘,右键托盘可以新建 如果已经有存在的便利贴,可以在便利贴的工具栏上点击新建也可以 工具栏中还有一个复制按钮,功能是在新建的同时会复制当前便利贴的样式(包括颜…

2022年3月24日 53条评论 6879点热度 42人点赞 大脸猫 阅读全文

C++类命名空间语法: <namespace>::<className> 但是在qss中,::符号已经被小部件语法使用,所以正确的语法是使用--表示命名空间,即 <namespace>--<className> namespace T{ class Widget{ ...... } } app.setStyleSleet("T--Widget{....}");

2022年2月28日 0条评论 436点热度 0人点赞 大脸猫 阅读全文
12