尊暮萧的个人空间 - qt
type: channel
link: https://www.zunmx.top/tag/qt/
items: xfreerdp 简易GUI程序
items: qt 在线安装器指定镜像
items: QT (c++语言) - pro文件中定义的属性在代码中使用
items: QT (c++语言) - 添加程序属性中的详细信息
items: [暂时闭源] KMU-Counter 使用情况统计器
items: QT (c++语言) - QTableWidget 数字表头排序问题
items: QT (c++语言) - Windows 添加图标
items: QT (c++语言) - Windows 打包
items: QT (c++语言) - 信息框图标隐藏
items: QT (c++语言) - 定时任务的创建

xfreerdp 简易GUI程序
type: item
date: 2024-07-09T18:39:00+08:00
description: 引言termux-x11 模式下支持的软件很少，但是好在有xfreerdp，这样的话，可以通过命令行来实现rdp的连接，但是记命令记不住，可视化的工具也没有，如果轻量使用，可以试试https://github.com/wyllianbs/xfreerdp-gui/，但是我为什么没有用这个呢？因为yad需要安装，apt尝试安装，不存在，源码编译yad又各种问题，后来又尝试zenity效果还不错，但是并不是我想要的，方案1--zenity#!/bin/bash # 获取用户输入的主要信息 USER_INPUT=$(zenity --forms \ --title="Remote Desktop Connection" \ --text="Enter the following details:" \ --separator="," \ --add-entry="Server Address" \ --add-entry="Username" \ --add-password="Password" \ --add-entry="Resolution (e.g., 1920x1080)" \ --add-combo="Color Depth (bpp)" --combo-values="8|16|24|32" \ --add-combo="Network" --combo-values="modem|broadband-low|broadband|broadband-high|wan|lan" \ --add-combo="Audio Mode" --combo-values="off|local|remote" \ --height=300) # 检查用户是否取消输入 if [ $? -ne 0 ]; then exit 1 fi # 解析用户输入 IFS=',' read -r SERVER USERNAME PASSWORD RESOLUTION BPP NETWORK AUDIO_MODE <<< "$USER_INPUT" # 获取用户输入的复选框选项 CHECKBOX_INPUT=$(zenity --list \ --title="Advanced Options" \ --text="Select the advanced options:" \ --separator="," \ --checklist \ --column="Select" --column="Option" \ TRUE "Dynamic Resolution" \ TRUE "Compression" \ TRUE "Glyph Cache" \ TRUE "Bitmap Cache" \ TRUE "Async Input" \ TRUE "Async Update" \ --height=300) # 检查用户是否取消输入 if [ $? -ne 0 ]; then exit 1 fi # 初始化选项参数 OPTIONS_ARRAY=() # 添加选项参数 $CHECKBOX_INPUT =~ "Dynamic Resolution" && OPTIONS_ARRAY+=("/dynamic-resolution") $CHECKBOX_INPUT =~ "Compression" && OPTIONS_ARRAY+=("/compression") $CHECKBOX_INPUT =~ "Glyph Cache" && OPTIONS_ARRAY+=("/gdi:hw") $CHECKBOX_INPUT =~ "Bitmap Cache" && OPTIONS_ARRAY+=("/bitmap-cache") $CHECKBOX_INPUT =~ "Async Input" && OPTIONS_ARRAY+=("/async-input") $CHECKBOX_INPUT =~ "Async Update" && OPTIONS_ARRAY+=("/async-update") # 生成完整的 xfreerdp 命令 COMMAND="xfreerdp /v:$SERVER /u:$USERNAME /p:$PASSWORD /size:$RESOLUTION /bpp:$BPP /network:$NETWORK ${OPTIONS_ARRAY[*]} /audio-mode:$AUDIO_MODE" # 执行 xfreerdp 命令 eval $COMMAND方案2--qtUI代码<?xml version="1.0" encoding="UTF-8"?> <u…

qt 在线安装器指定镜像
type: item
date: 2023-07-13T15:49:00+08:00
description: 引言安装新版本的qt不再支持离线安装了，只能用在线的安装器安装，然而服务器在境外（有一个在芬兰），下载速度真的是泪崩呀。参数列表Usage: qt-unified-windows-x64-4.6.0-online.exe [options] command <args> <key=value> Qt Installer Framework supports both GUI and headless mode. The installation operations can be invoked with the following commands and options. Note that the options marked with "CLI" are available in the headless mode only. Commands: in, install - install default or selected packages - <pkg ...> ch, check-updates - show available updates information on maintenance tool up, update - update all or selected packages - <pkg ...> rm, remove - uninstall packages and their child components - <pkg ...> li, list - list currently installed packages - <regexp> se, search - search available packages - <regexp> Note: The --filter-packages option can be used to specify additional filters for the search operation co, create-offline - create offline installer from selected packages - <pkg ...> cc, clear-cache - clear contents of the local metadata cache pr, purge - uninstall all packages and remove entire program directory Options: -?, -h, --help Displays help on commandline options. --help-all Displays help including Qt specific options. -v, --version Displays version information. -d, --verbose Verbose mode. Prints out more information. Adding -d or --verbose more than once increases verbosity. -g, --logging-rules <rules> Enables logging according to passed rules. Comma separated logging rules have the following syntax: loggingCategory=true/false. Passing empty logging rules enables all logging categories. The following rules enable a single category: ifw.*=false, ifw.category=true. The following logging categories are available: ifw.installer.installlog ifw.server --ar, --add-repository <URI,...> Add a local or remote repository to the list of user defined repositories. --at, --add-temp-repository <URI,...> Add a local or remote repository to the list of temporary available repositories. --st, --set-temp-repository <URI,...> Set a lo…

QT (c++语言) - pro文件中定义的属性在代码中使用
type: item
date: 2023-06-21T14:44:53+08:00
description: 引言比如在程序中显示版本信息和编译时间，这时候我们虽然可以每次打包时修改，但是还是比较麻烦，通过这种方式可以修改一个地方，其他地方就不用管了，相当于配置文件。代码参考：在pro文件中添加以下内容VERSION = 1.0.5 DEFINES += APP_VERSION=\\\"$$VERSION\\\" DEFINES += APP_WEBSITE=\\\"www.zunmx.top\\\" DEFINES += APP_COPYRIGHT=__DATE__ DEFINES += APP_COMPILE=__TIME__其中version和属性中是一样的，如果需要引用定义的变量，前面加上$$，当然也可以使用常量和内置函数，比如说日期和时间。在代码中直接使用即可const QString PRODUCT_VERSION=APP_VERSION; const QString COPYRIGHT = QString("%1").arg(APP_COPYRIGHT).split(" ")[2]; const QString WEBSITE = APP_WEBSITE; const QString BUILD_DATE = QString("%1 %2").arg(QLocale(QLocale::English).toDateTime(APP_COPYRIGHT, "MMM dd yyyy").toString("yyyy-MM-dd")).arg(APP_COMPILE);

QT (c++语言) - 添加程序属性中的详细信息
type: item
date: 2023-06-21T14:38:00+08:00
description: 引言QT项目打包后添加版权信息，文件说明等代码在pro文件中添加以下信息VERSION = 1.0.5 //版本信息 RC_LANG = 0x0004 // 语言，中文 RC_ICONS = icon.ico // 程序图标 QMAKE_TARGET_COPYRIGHT = "Copyright ZunMX All rights reserved." // 版权 QMAKE_TARGET_DESCRIPTION = "A recording program for system usage" // 文件说明 QMAKE_TARGET_COMPANY = " ZunMX " // 公司 QMAKE_TARGET_PRODUCT = " KMU-Counter " // 产品名称尝试了修改pro编码和msvc的编码，中文部分还是会乱码，暂时不知道如何解决。

[暂时闭源] KMU-Counter 使用情况统计器
type: item
date: 2023-06-06T16:52:00+08:00
description: KMU-Counter软件名称：KMU-Counter软件最新版本：1.1.6版本标识：正式版发布时间：2025-12-03编程语言：c++架构：QT适用平台：Windows权限申请● 本地文件读/写 (用于SQLite数据库操作)● 监控鼠标/键盘操作 (用于基础数据支撑)● 窗口信息获取 (用于基础数据支撑)● 网络通讯权限 (用于获取更新)● 获取屏幕截图 (可自选关闭)使用文档[post cid="1918" cover="" size=""/]授权许可证未注册和注册用户目前是相同的功能，只是未授权的用户每次启动时会弹出授权窗口。授权码可以通过联系管理员admin@zunmx.top，进行试用或~购买~。自助试用授权页面目前尚未开发完成。[font color="#10FF10"]软件内提供license.txt，授权到期至2023年12月31日[1.1.3-:)版本提供至2024-06-01的试用许可证[/font]邮箱：demo@zunmx.top 注册码：[binary] 有效期至：2026-12-31 23:59:59截图[collapse status="true" title="新版增量截图"][album type="photos"][/album][/collapse][collapse status="false" title="初版归档"][album type="photos"][/album][/collapse]更新日志[collapse status="true" title="v1.1.6"]发布日期：2025-12-03[💥] 修复了部分日期格式化问题[💥] 修复了句柄泄露问题，提高程序稳定性[💥] 修复了一些情况下窗体记录失败[💥] 修复了部分模块的缓冲区溢出问题[💥] 修复了锁屏时重叠记录[🚩] 新增UI键盘展示次数（实验性功能）[🚩] 新增托盘图标的提示文字[🎈] 升级QT版本至6.10.0[🎈] 升级openssl版本至3.5.4[🎈] 优化屏幕截图逻辑，支持多监视器[🎈] 屏幕截图格式png变更jpg，质量75，减小占用[🎈] 日志输出更加友好[🎈] 申请uac权限(部分目录权限问题)[🎈] 窗体标题获取不到时用类名代替(CN:[xxx])[/collapse][collapse status="true" title="v1.1.5"]发布日期：2025-8-15[💥] SHIFT按抬起次数统计异常的bug[💥] 锁屏时间和锁屏前的窗口重叠记录[💥] 重复运行时样式丢失[🚩] 新增打开文件所在目录[🚩] 新增删除图标缓存[🎈] 更换安装器，压缩安装包体积(但是无法检测更新，样式不那么好看了)[🎈] 升级QT版本至6.9.0[🎈] 更新OpenSSL至3.4.0[/collapse][collapse status="true" title="v1.1.4"]发布日期：2024-01-31[💥] 删除历史记录时提示未选择类别bug[🚩] 新增批量删除使用记录(按标题)[🚩] 新增批量复制使用记录(按标题)[🚩] 新增锁定功能 (轻度防卫) 【需授权】[🎈] 总统计持续时间格式化为日时分秒[🎈] 总统计切换时loading状态异常[/collapse][collapse status="true" title="v1.1.3"]发布日期：2023-12-22[💥] 类别筛选数据不正确[💥] 视图转换后自动跳转至最新日期[💥] 部分情况下存在注入问题导致无法持久化[💥] 程序图标获取异常bug修复[🎈] 调试版本明显标识 [此版本仅限开发][🎈] 升级QT版本至6.61[/collapse][collapse status="true" title="v1.1.2"]发布日期：2023-10-31[💥] 部分应用无法记录（已知红警2游戏）[🔧特殊符号][💥] 初始化数据库异常[💥] 统计导出缺失数据[💥] 总统计键盘活动次数数据异常[🚩] 新增类别统计 [🎉终于来啦][🚩] 添加了按键记录逻辑选项（实际输入和按下弹开计数方式）[⚡] 仓库数据填补，如后期开源，前些版本中缺失的文件可在此次提交中找到。[/collapse][collapse status="true" title="v1.1.1"]发布日期：2023-09-04[💥] 修复了清除数据使用情况清除失败的问题[💥] 修复了总统计中进程统计缺少数据的问题[💥] 修复了筛选器清除不彻底的问题[🚩] 添加了数据库尺寸释放逻辑[🎈] 升级QT版本至6.52[/collapse][collapse status="true" title="v1.1.0"]发布日期：2023-07-05[💥] 修复了跨天数据异常[💥] 修复了开机自…

QT (c++语言) - QTableWidget 数字表头排序问题
type: item
date: 2023-05-11T16:53:04+08:00
description: 引言QTableWidget 表头排序是根据字符串进行排序，如果这个列中只有数字，就变成了这样的了。解决方案重写QTableWidgetItem类class Item: public QTableWidgetItem { public: Item(QString str){ this->setText(str); } bool operator< (const QTableWidgetItem &other) const { return (this->text().toInt() < other.text().toInt()); } };调用时new Item(QString("%1").arg(staticData[row].getCount())));如果是字符串类型，就用原始的类，不要用重写的这个类，不然会排序失败的。

QT (c++语言) - Windows 添加图标
type: item
date: 2023-05-11T15:38:39+08:00
description: 引言不加图标太丑了，其实添加图标还算是挺容易的。实现在pro文件中添加一行RC_ICONS = icon.ico 就可以了。如QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h \ FORMS += \ mainwindow.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target RC_ICONS = icon.ico DISTFILES += RESOURCES += \ resource.qrc此时目录结构是这样的最终最终生成的文件是这样的。

QT (c++语言) - Windows 打包
type: item
date: 2023-05-09T17:30:00+08:00
description: 引言在Qt Creator中构建项目后，直接打开编译后的程序，会提示如下窗口。找不到Qt*.dll，无法继续执行代码操作打开构建工具包，有些项目MinGW 可以编译，有些MSVC可以编译切换到构建目录，这个目录可以在下图所示部分找到。找到exe文件所在的路径执行命令windeployqt [exe文件]最终目录里会出现这么多文件简化打开exe文件，此时是可以正常打开的，不要关闭exe程序，全选这个目录里所有文件，删除，如果提示被占用无法删除的跳过，最终会剩下一部分文件，剩下的也是必要的文件了。如果还要精简，最好的方案是自己简化qt代码，自己打包qt。

QT (c++语言) - 信息框图标隐藏
type: item
date: 2023-05-09T13:27:00+08:00
description: 引言最近做的这个小玩意儿我打算拦截关闭事件，并且提示，确定要关闭的询问，但是这上的图标始终都是这种难看的默认图标，怎么也没有改掉，反而询问的那个？可以自定义改掉，很头大。实践索性直接去掉图标吧，这样就省事儿了。msgBox.setWindowFlags(Qt::Drawer); // 去掉标题栏上的图标详细代码QMessageBox msgBox; msgBox.setWindowTitle(tr("退出")); msgBox.setWindowFlags(Qt::Drawer); // 去掉标题栏上的图标 msgBox.setIcon(QMessageBox::Question); msgBox.setText(tr("确定要退出吗？")); msgBox.setInformativeText(tr("退出后就不能监控按键数量了。")); QPushButton *ok = msgBox.addButton(tr(" 确定 "), QMessageBox::ActionRole); QPushButton *cancel = msgBox.addButton(tr(" 取消 "), QMessageBox::ActionRole); msgBox.setDefaultButton(ok); msgBox.setEscapeButton(cancel); msgBox.exec(); if (msgBox.clickedButton() == ok) { QApplication::exit(0); } else if (msgBox.clickedButton() == cancel) { return; }自定义显示图标msgBox.setIconPixmap(QPixmap(":/imgs/icon"));这种做法前提是需要提前把图标给放到资源文件中去。

QT (c++语言) - 定时任务的创建
type: item
date: 2023-05-09T13:18:00+08:00
description: 引言对于C端程序，定时器的使用是比较普遍的，比如我编程启蒙语言易语言，如果说让他每秒进行一个操作，是很容易的。而js的话，setInterval也是可以很轻易的实现定时器功能，java语言通过TimerTask也是可以做到定时任务的功能。实现QT中的定时器也是很容易的就可以做到的，代码如下所示常规方式QTimer *timer = new QTimer(this); // 创建实例 connect(timer, &QTimer::timeout, this, &MainWindow::test); // 连接信号和槽 timer->start(5000); // 每5秒执行1次 timer->stop(); // 计时器停止如果是常规做法的话，需要创建函数，使其定时器调用那个函数。lambda方式创建QTimer * timer1 = new QTimer(this); timer1->start(1000); // 1000毫秒执行1次 connect(timer1,&QTimer::timeout,[=](){ // 业务部分 });[=]() 看起来像是提供this为参数的匿名函数，具体是什么意思有待剖析。截图