Qt的一些经验总结(9)

判断文件类型

  • 通过QMimeDatabase中的mimeTypeForFile接口能够直接判断对应文件的类型,但是不够准确。比较特殊的例子是如果当前一个文件后缀名是图片格式,但实际内容是文本,这个接口会返回对应的图片格式类型,导致显示错误。具体原因可以看一下源码。
  • 比较推荐的方式是直接调用mimeTypeForData接口,将部分文件内容传入进行解析文件格式
c++ 复制代码
QByteArray content; 
QFile file(path); 
if (file.open(QFile::ReadOnly | QFile::Text))
{
    // 16k数据的来源是源自源码
    content = file.peek(16384); 
} 
QMimeDatabase db; 
const QMimeType mime = db.mimeTypeForData(content);

QTextEdit

需要去除内边距,设置padding和margin都没什么用,实际应该是设置document的margin才有效果

c++ 复制代码
textEdit.document().setDocumentMargin(0);

linuxdeployqt

打包AppImage的时候发现,如果当前程序使用了Multimedia,则需要将qt的plugins中的multimedia模块拷贝到打包文件夹中的plugins,这个打包程序不会自动的把这个插件拷贝过来。

QFileInfo

当有近4万的数据要转换成QFileInfo时,速度比较慢。 旧实现和耗时:

新实现和耗时:

这边只是获取文件是否存在并且或者最后一次修改时间,用于判断文件是否有更新。QFileInfo的构造,会初始化不少东西,导致性能的损耗,只是获取这两个信息,通过调用系统级的api,可以快速获取到,从而提升性能。

遍历文件夹

旧实现:

新实现:

两者比较,在遍历4万的数据时,新实现比旧实现快100ms左右。两种方式的最大区别是,QDirIterator不支持排序,但是这边的需求只是遍历所有的文件夹,所以使用QDirIterator速度会更快一点。

引用github三方开源库

个人感觉目前比较好的方案,并且实际使用的是cpm
github.com/cpm-cmake/C...

简单用法

scss 复制代码
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

# create project
project(MyProject)

file(
        DOWNLOAD
        https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.38.3/CPM.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake
        EXPECTED_HASH SHA256=cc155ce02e7945e7b8967ddfaff0b050e958a723ef7aad3766d368940cb15494
)
include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake)

# add executable
add_executable(main main.cpp)

# add dependencies
include(cmake/CPM.cmake)

CPMAddPackage("gh:fmtlib/fmt#7.1.3")
CPMAddPackage("gh:nlohmann/json@3.10.5")
CPMAddPackage("gh:catchorg/Catch2@3.4.0")

# link dependencies
target_link_libraries(main fmt::fmt nlohmann_json::nlohmann_json Catch2::Catch2WithMain)
perl 复制代码
# A git package from a given uri with a version
CPMAddPackage("uri@version")
# A git package from a given uri with a git tag or commit hash
CPMAddPackage("uri#tag")
# A git package with both version and tag provided
CPMAddPackage("uri@version#tag")
相关推荐
智者知已应修善业1 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8082 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站3 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit3 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen874 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码4 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler014 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1134 小时前
Linux进程与线程编程详解
linux·c++
A7bert7775 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902705 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio