
Qt
文章平均质量分 84
imred
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。
展开
-
Qt:愚蠢的qmake
博主参与了一个使用qmake构建的项目,包含几百个源文件,最近遇到一个恼人的问题:有时仅仅修改了一个.cpp文件,构建项目时就有可能触发全编译。但是编译时又会命中ccache的缓存,这说明源代码实际上内容并没有发生变化。原创 2024-07-21 23:25:54 · 936 阅读 · 1 评论 -
使用OpenGL实现ASCII Art滤镜
效果图:仓库地址:https://github.com/im-red/asciiart_gl之前使用Qt实现过一个CPU版本的ASCII Art滤镜,流程大致如下:根据字体选择确定单元方格大小。将每个可用字符绘制到单元方格大小的空白图片上,计算每个可用字符的平均灰度值。根据第二步计算出来的每个可用字符的平均灰度值,生成一个0~255灰度值到字符的映射表。按单元方格大小对输入图片进行划分,灰度化后求每个方格的平均灰度值。查询灰度值到字符的映射表,对输入图片的每个方格使用字符进行填充。CP原创 2020-10-25 16:47:27 · 356 阅读 · 0 评论 -
Qt:监控一个QObject对象发射的所有信号
如果我们想要监控一个QObject对象发射的所有信号,同时又不追求手段的通用性的话,可以给目标对象的每个信号写一个槽函数,然后手动connect。这听起来就麻烦,有没有不那么麻烦的通用方法呢,自然是有的。如果能对Qt的信号槽原理进行一点深入的探索,我们就能以很简单的方法达到我们的目的。以下代码均基于Qt5.12.7。信号槽的连接保存在sender的metaObject中,其数据结构为QObjectPrivate::Connection:struct Connection{ QObject *原创 2020-10-08 18:08:12 · 2833 阅读 · 0 评论 -
四种迷宫生成算法的实现和可视化
(上图是使用随机化Prim算法生成一个200x200的迷宫的过程)Github项目地址:maze前言本文中的迷宫指的是最常见的那种迷宫:迷宫整体轮廓是二维矩形,迷宫里的格子是正方形的,格子上下左右各相邻另外一个格子(边和角除外),迷宫内部没有环路,也没有无法到达的格子,起点在一个角(本文中为左上角),终点在另一个角(本文中为右下角),从起点到终点有且仅有一条路径:每个格子都可以抽象成图...原创 2020-04-05 17:29:24 · 17787 阅读 · 1 评论 -
Qt:为什么QGraphicsView设置Antialiasing/SmoothPixmapTransform没生效?
QGraphicsView::setRenderHint有两个常用的选项:QPainter::Antialiasing和QPainter::SmoothPixmapTransform,前者是用来打开反走样功能,后者用来在对图片进行缩放时启用线性插值算法而不是最邻近算法。然而这两个选项都有一些坑,想达到预期的效果的话得做一些额外的功课。QPainter::Antialiasing和QOpenGLW...原创 2020-03-08 00:37:00 · 2904 阅读 · 0 评论 -
QString和QByteArray
QString有一个未标记为explicit的构造函数QString(const QByteArray &ba),导致许多形参为QString的函数可以接受类型为QByteArray的实参,时间久了会会以为这两个类可以随意混用,但实际并不是这样,这两个类适用的场景还是有区别的。QString相较QByteArray更高级更抽象,QByteArray则更底层更具体。QString基本单位是...原创 2020-02-10 23:45:34 · 2317 阅读 · 0 评论 -
QML:使用ListView运行时动态载入Item
想要实现使用ListView运行时动态载入Item,需要两个步骤:动态生成Item将动态生成的Item插入到ListView的model中对于这两个步骤,前者可以使用createComponent和Component.createObject实现,后者可以使用ObjectModel实现,详细内容可见官方文档:http://doc.qt.io/qt-5.9/qml-qtqml-qt.ht...原创 2018-12-16 16:56:14 · 6586 阅读 · 5 评论 -
QML:使用Model/View框架时根据不同的数据项使用不同的delegate
Qt自带的QML使用Model/View框架的example中,展示数据使用的delegate(似乎)都是唯一的,不能根据不同的Model数据项使用不同的Item来展示。如果有这样一个需求:Model的数据项中有一个字段为itemType,展示数据时希望能够根据这个字段使用不同的Item来展示数据,能否实现呢?自然是可以的:我们可以将View的delegate字段设为一个Loader,然后让这个L...原创 2018-12-16 17:42:32 · 1898 阅读 · 0 评论 -
编辑距离算法和Levenshtein距离算法
前言最近在研究diff工具的实现,已经写了一个简单的demo,不过目前这个demo只是把Levenshtein距离算法的结果用Qt可视化了出来而已,还没有实用价值,界面如下:各种diff工具的核心基本都是编辑距离算法,网上许多文章把编辑距离算法等同于Levenshtein距离算法,但实际上Levenshtein距离算法只是各种编辑距离算法其中之一。各种编辑距离算法会使用不同的编辑操作种类,例...原创 2019-03-25 20:53:47 · 1981 阅读 · 0 评论 -
Myer差分算法(Myer's diff algorithm)
Myer差分算法是一个时间复杂度为O(ND)的diff算法,就以diff两个字符串为例,其中N为两个字符串长度之和,D为两个字符串的差异部分的总长度。这个算法首先发表在An O(ND) Difference Algorithm and Its Variations。Myer差分算法直接解决的问题是最长公共子序列(LCS)的等价问题——最小编辑脚本(SES)问题。当然了,这是论文中的表述,在我看来...原创 2019-04-03 21:51:41 · 4993 阅读 · 0 评论 -
Qt在Linux下如何查找可用字体
最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。我一开始考虑是字符编码问题,调用QChar::unicode检查中文字符的编码,发现没有问题。如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。调用QFontDatabase::families检查所有可...原创 2019-04-09 20:58:13 · 4331 阅读 · 0 评论 -
Qt使用OpenGL进行多线程离屏渲染
基于Qt Widgets的Qt程序,控件的刷新默认情况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。如果某个控件的paintEvent非常耗时(等待数据时间+CPU处理时间+GPU渲染时间),会导致刷新帧率下降,界面的响应速度变慢。假如这个paintEvent耗时的控件没有使用OpenGL渲染,完全使用CPU渲染。这种情况处...原创 2019-07-28 11:58:14 · 16716 阅读 · 28 评论 -
linux下鼠标事件丢失与evdev缓冲区溢出问题
之前遇到这样一个bug:在一个性能较差的linux平台上的一个Qt程序,当UI线程在执行耗时操作时,界面会卡顿,而这时频繁点击滑动鼠标,会出现鼠标事件丢失的问题。举个例子:某个控件收到一个鼠标按下的事件,但再也没有收到鼠标弹起事件,而此时鼠标按键实际上已经弹起了,这就导致程序进入了一种异常状态,除非再次点击鼠标,否则无法恢复。上面这个问题是在QApplication的事件过滤器中确定的,全局的QA...原创 2018-12-15 17:33:18 · 1144 阅读 · 2 评论 -
Qt的事件驱动机制与eventfd
简介Qt是一个事件驱动的GUI框架,那么,这个“事件驱动”说的是什么呢?以我的理解就是:对于UI线程,除了初始化代码和主循环本身之外,跑在CPU上的每条指令,要么是为了接收事件,要么就是某个事件触发的,这个事件可以直接来源于用户操作,也可以间接来源于用户操作(处理用户操作事件时触发了需要异步处理的其他事件),或者来源于socket,或者来源于定时器,等等。使用事件驱动能够避免对CPU时间的...原创 2018-09-02 20:45:36 · 3153 阅读 · 1 评论 -
Qt无法使用qDebug()输出QEvent对象详细信息的解决方法
长话短说,QDebug operator<<(QDebug, const QEvent *);这个函数声明在qevent.h中,这个函数实现了使用QDebug对象获得QEvent对象详细信息的功能。我们为了使用QEvent类通常会#include <QEvent>,尴尬的是QEvent文件中并没有包含qevent.h文件,而是包含了qcoreevent.h文件,...原创 2018-04-13 00:08:41 · 1792 阅读 · 0 评论 -
“无法定位程序输入点_ZdaPvj于动态链接库Qt5Cored.dll”的解决办法
这个是由于在环境变量中找到的库的版本不兼容,一般来说最简单的解决方案就是把Qt SDK的路径放在在环境变量的最前面。原创 2017-01-04 16:08:39 · 9417 阅读 · 0 评论 -
Qt中QMainWindow对象设置layout的方法
QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法。 需要做的只是先定义一个QWidget对象,然后使用QMainWindow::setCentralWidget()函数来将该QWidget对象设置为Central Widget,然后使用该QWidget对象的setLayout()函数,就可以了,不过后续对象都要原创 2017-01-12 23:27:30 · 8144 阅读 · 3 评论 -
QCamera使用QGraphicsVideoItem输出图像
QCamera在官方文档的介绍中提到了3种输出的方式,其中两种比较常规的方式为通过widgets输出和通过QGraphicsView输出。通过widgets输出时使用的是QCameraViewfinder类,而通过QGraphicsView输出时使用的是QGraphicsVideoItem类。 官方文档中仅仅给出了使用QCameraViewfinder类的例子,并没有给出使用QGraphicsVi原创 2017-01-31 14:16:25 · 5736 阅读 · 5 评论 -
Qt实现Trackball交互方式代码
毕设要用到Qt+OpenGL,生成三维模型后需要能够进行拖动旋转等用户交互,因此我实现了Trackball类型的交互代码。Trackball的原理见https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball,在此只做简单介绍。 实现Trackball需要对交互时鼠标的起点和终点进行记录,根据鼠标移动的轨迹改变三维模型旋转矩阵的值,进而实现三原创 2017-04-20 18:02:32 · 1283 阅读 · 0 评论 -
Qt使用connect函数时向slot传递参数
设想这样一种场景:共有5个button,button1~button5,点击button1时输出“button 1 clicked”,点击button2时输出“button 2 clicked”,该如何实现呢? 最粗暴的实现是写5个slot,然后将button与slot分别connect,但这明显会增加许多重复代码,不是一种好的实现。 一种比较好的方式是使用QSignalMapper,它可以接收原创 2017-06-08 22:52:30 · 16143 阅读 · 0 评论 -
学习Qt状态机框架时遇到的一个bug
Qt的状态机框架官方文档(http://doc.qt.io/qt-5/statemachine-api.html)的第一个例子如下:QStateMachine machine;QState *s1 = new QState();QState *s2 = new QState();QState *s3 = new QState();s1->assignProperty(ui->button, "原创 2017-06-09 19:00:40 · 666 阅读 · 0 评论 -
Qt使用connect函数时向slot传递参数:使用lambda表达式
大家可以先看一下我的之前一篇文章:http://blog.youkuaiyun.com/imred/article/details/72940365,这篇是对它的补充,使用lambda表达式这种方法也在https://stackoverflow.com/questions/5153157/passing-an-argument-to-a-slot的回答中。 使用lambda表达式向slot传递特定参数使用的是原创 2017-06-13 16:46:10 · 9612 阅读 · 0 评论 -
使用Qt Designer生成的ui文件的几种方式
阅读Qt提供的样例时,看到过好几种使用Qt Designer生成的ui文件的方式,感到有些混乱,所以参考Qt官方文档http://doc.qt.io/qt-5/designer-using-a-ui-file.html进行了整理。 使用ui文件的方式主要分为两类,一类在编译时进行,一类在运行时进行,由于后一类我没有用到过,因此没有进行整理。 假设我们的ui文件为calculatorform.ui原创 2017-06-25 22:11:51 · 4262 阅读 · 0 评论 -
Qt连接MySQL提示“QSqlDatabase: QMYSQL driver not loaded”的解决办法
我使用的Qt版本是Qt5.7.1 msvc2015 64位版,实际上并没有使用MySQL,而是MariaDB,版本为10.2.6。当我运行Qt附带的样例“sqlbrowser”时,总会提示如下信息:QSqlDatabase: QMYSQL driver not loadedQSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC Q原创 2017-06-26 09:35:03 · 17257 阅读 · 1 评论 -
Qt中QComboBox下拉列表(popup)位置与样式的控制
转载请注明来源:http://blog.youkuaiyun.com/imred Qt中的QComboBox在不同平台下有所差异(主要是不可编辑的QComboBox),如下样式A和样式B: 左边为样式A为“fusion”样式,在ubuntu下的样式似乎就是这个,它的特点是下拉列表会把文字框和箭头盖住。右边样式B为“windowsvista”样式,它是win10下Qt的默认样式,其特点是下拉列表会显示在文原创 2017-10-04 15:18:45 · 41956 阅读 · 12 评论 -
Qt中QTabWidget隐藏某些tab
对于一个QTabWidget,有时我们需要在不同的状态下显示不同的tab,需要隐藏掉某些tab。使用removeTab()固然可以做到,但是这样的话我们再次需要显示这些tab时再把它们加进去,有时候计算index会很麻烦。所以有没有什么办法可以在不删除tab的前提下隐藏掉某些tab呢,这样就能避免再次添加tab和计算index的麻烦。 遗憾的是Qt并没有对tab提供类似hide()或者setVis原创 2017-12-17 23:02:14 · 32257 阅读 · 12 评论 -
C++中将枚举量值映射到枚举量名的三种方法:使用Qt、手工映射与使用Better Enums
引子最近遇到这样一种场景:为了方便调试Qt程序,需要对某些Qt控件的主要事件(鼠标事件、键盘事件和焦点事件等)进行日志记录。Qt每种事件类都是QEvent类的派生类,其具体类型可使用QEvent::type()方法获得,该方法返回一个QEvent::Type类型的枚举量。所以最基本的实现是这样的(假设要对Widget类的事件进行记录,用标准输出代替日志输出):bool Widget::ev...原创 2018-04-14 19:59:23 · 4059 阅读 · 0 评论 -
QtEmbedded开发环境安装
首先下载源码包,解压后cd进去。首先安装QtEmbedded,./configure -embedded generic -qvfbmakesudo make install中间出错的话一般是有些依赖没装好,装好后重新编译安装。然后记得设置环境变量。 然后需要安装virtural framebuffer,用它来模拟一个嵌入式设备。在安装它之前,首先需要安装qt for x11,因为刚才下载的源码包原创 2016-10-20 15:35:05 · 2514 阅读 · 0 评论