Qt 获取文件图标、类型 QFileIconProvider

这篇具有很好参考价值的文章主要介绍了Qt 获取文件图标、类型 QFileIconProvider。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt中获取系统图标、类型是通过QFileIconProvider来实现的,具体如下:

一、Qt获取系统文件图标

1、获取文件夹图标

 QFileIconProvider icon_provider;

 QIcon icon = icon_provider.icon(QFileIconProvider::Folder);

 

2、获取指定文件图标

QFileInfo file_info(name);
QFileIconProvider icon_provider;
QIcon icon = icon_provider.icon(file_info);

 

二、Windows编程中获取系统图标、类型:

QIcon Setting::getFileIcon(QString file_name)
{
 QIcon file_icon = QIcon(":/icon/file");
 if(!file_name.isEmpty())
 {
  //获取后缀
  std::string str = "file";
  int index = file_name.lastIndexOf(".");
  if(index >= 0)
  {
   QString suffix = file_name.mid(index); 

   //将QString转化为std::string
   str = suffix.toUtf8().constData(); //std::string((const char *)path.toLocal8Bit())  path.toLatin1().data();
  }

  LPCSTR name = str.c_str();

  
  SHFILEINFOA info;
  if(SHGetFileInfoA(name,
   FILE_ATTRIBUTE_NORMAL,
   &info,
   sizeof(info),
   SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
  {
   HICON icon = info.hIcon;
   file_icon = QIcon(QPixmap::fromWinHICON(icon));
  }
 }

 return file_icon;
}

 

QString Setting::getFileType(QString file_name)
{
 QString file_type = QString("file");
 if(!file_name.isEmpty())
 {
  //获取后缀
  std::string str = "file";
  int index = file_name.lastIndexOf(".");
  if(index >= 0)
  {
   QString suffix = file_name.mid(index); 

   //将QString转化为std::string
   str = suffix.toUtf8().constData();
  }

  LPCSTR name = str.c_str();

  
  SHFILEINFOA info;
  if(SHGetFileInfoA(name,
   FILE_ATTRIBUTE_NORMAL,
   &info,
   sizeof(info),
   SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
  {
   std::string type = info.szTypeName;
   file_type = type.c_str();
  }
 }

 return file_type;
}

 

QIcon Setting::getFolderIcon()
{
 QIcon folder_icon = QIcon(":/icon/folder");

 //将QString转化为std::string
 std::string str = "folder";
 LPCSTR name = str.c_str();

 
 SHFILEINFOA info;
 if(SHGetFileInfoA(name,
  FILE_ATTRIBUTE_DIRECTORY,
  &info,
  sizeof(info),
  SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_USEFILEATTRIBUTES))
 {
  HICON h_icon = info.hIcon;

  folder_icon = QIcon(QPixmap::fromWinHICON(h_icon)); 
 }

 return folder_icon;
}

 

QString Setting::getFolderType()
{
 QString folder_type = QString("folder");
 std::string str = "folder";
 LPCSTR name = str.c_str();

 
 SHFILEINFOA info;
 if(SHGetFileInfoA(name,
  FILE_ATTRIBUTE_DIRECTORY,
  &info,
  sizeof(info),
  SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
 {
  std::string type = info.szTypeName;
  folder_type = type.c_str();
 }

 return folder_type;
}

Qt 获取文件图标、类型 QFileIconProvider,Qt,qt,开发语言

两种方式最大的区别是什么呢?参考:filesystems - Qt 4.8 - QFileIconProvider, Getting icon for non-existent file (based on extension) - Stack Overflow 诸如所言,Qt所提供的获取图标的方法是本地已存在的文件,如果要通过扩展名来获取图标则需要自己来虚拟构造本地文件,而在数据量较大的情况下往往会影响性能。这(通过扩展名获取图标、类型)可以通过Windows API来实现,即方法二。

Qt5开始QPixmap::fromWinHICON(HICON)已经消失得无影无踪,且获取图标、后缀的方法仍针对本地已存在的文件,那么,只能另寻出路,此节讲述如何通过扩展名来创建临时文件,并获取对应的图标、类型。

步骤:

通过扩展名extension(.***)构造临时文件QTemporaryFile

通过QFileIconProvider获取对应的图标、类型

删除临时文件

获取图标

QIcon FileIcon::fileExtensionIcon(const QString & extension) const 
{
QFileIconProvider icon_provider;
QIcon icon;
QTemporaryFile tmp_file(QDir::tempPath() + QDir::separator() +
QCoreApplication::applicationName() + "_XXXXXX" + extension);
tmp_file.setAutoRemove(false);

if(tmp_file.open()) 
{
QString file_name = tmp_file.fileName();
tmp_file.write(QByteArray());
tmp_file.close();

icon = icon_provider.icon(QFileInfo(file_name));
tmp_file.remove();
} 
else 
{
qCritical()<<QString("failed to write temporary file %1") .arg(tmp_file.fileName());
}

return icon;
}
获取类型

QString FileIcon::fileExtensionType(const QString & extension) const 
{
QFileIconProvider icon_provider;
QString type;
QTemporaryFile tmp_file(QDir::tempPath() + QDir::separator() +
QCoreApplication::applicationName() + "_XXXXXX" + extension);
tmp_file.setAutoRemove(false);

if(tmp_file.open()) 
{
QString file_name = tmp_file.fileName();
tmp_file.write(QByteArray());
tmp_file.close();

type = icon_provider.type(QFileInfo(file_name));

tmp_file.remove();
} 
else 
{
qCritical()<<QString("failed to write temporary file %1") .arg(tmp_file.fileName());
}

return type; 
}

Qt 获取文件图标、类型 QFileIconProvider,Qt,qt,开发语言

Qt 获取文件图标、类型 QFileIconProvider,Qt,qt,开发语言 

 文章来源地址https://www.toymoban.com/news/detail-683414.html

到了这里,关于Qt 获取文件图标、类型 QFileIconProvider的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 已有wchar_t *类型的filepath,使用Qt打开该文件

    1.wchar_t *转QString 2.Qt快速转换路径(斜杠与反斜杠转换)_tonativeseparators-CSDN博客 C:\\\\Users\\\\lpl\\\\Desktop\\\\腾讯视频.exe 到 C:/Users/lpl/Desktop/腾讯视频.exe 3.从外部打开 文件 或 文件夹 Qt之QDesktopServices-CSDN博客

    2024年02月08日
    浏览(32)
  • Android获取本机各种类型文件列表(音乐、视频,作为字节跳动面试官

    获取视频列表 /** 获取本机视频列表 @return */ public List getVideos() { List videos = new ArrayList(); Cursor c = null; try { // String[] mediaColumns = { “_id”, “_data”, “_display_name”, // “_size”, “date_modified”, “duration”, “resolution” }; c = mContentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, nu

    2024年04月12日
    浏览(45)
  • C/C++/QT/Python/MATLAB获取文件行数的示例

    方法一:使用 numel 函数 方法二:使用 size 函数

    2024年02月13日
    浏览(34)
  • PyQt5利用Qt Designer制作一个可以拖动获取文件信息的页面

    前言 本篇在讲什么 用pyqt5制作一个简单的程序,拖动文件或脚本可以读取文件信息 本篇适合什么 适合 初学PyQt5 的小白 本篇需要什么 对 Python 语法有简单认知 对 Qt 有简单认知 依赖 Pycharm 编辑器 本篇的特色 具有全流程的 图文教学 重实践,轻理论,快速上手 提供全流程的

    2024年01月15日
    浏览(67)
  • Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型

    udev_enumerate_add_match_subsystem函数的参数是用来设置子系统的过滤条件。通过添加不同的子系统过滤条件,可以过滤出指定子系统下的设备。 在示例代码中,udev_enumerate_add_match_subsystem(enumerate, “block”)用于添加\\\"block\\\"子系统的过滤条件,而udev_enumerate_add_match_subsystem(enumerate, “u

    2024年02月10日
    浏览(40)
  • Qt 常用方法 获取磁盘总大小、可用空间、文件夹大小 文件大小B KB M G转换

    1.通过QFile获取文件大小 注意:返回的是字节个数 通过QFileInfo获取文件大小 2. 获取磁盘空间 3 .获取选择路径下总文件大小 4. 转换大小单位 bit  === byte   bit / 8 byte === KB byte / 1024 KB = MB KB / 1024 MB = GB MB / 1024 GB === TB GB / 1024

    2024年02月06日
    浏览(71)
  • Qt —— 编译Qt5版本QFTP库,并实现连接服务、获取列表、上传、下载、删除文件等操作(附源码、附基于Qt5编译好的QFTP库)

    示例效果1   示例效果2   介绍      QFTP是Qt4的库,Qt5改用了QNetworkAccessManager来代替。但是Qt5提供的QNetworkAccessManager仅支持FTP的上传和下载,所以只能 将QFTP库编译为Qt5的库来进行调用。      QFTP在Github的下载地址:https://github.com/qt/qtftp   客户端源码生成的rele

    2024年01月20日
    浏览(43)
  • QT-QTableWidget设置单元项图标和图标大小

    要设置 QIcon 的大小,你可以使用 QPixmap 来加载原始图像,并调用 QPixmap 的 scaled() 函数来缩放图像的尺寸。然后,将缩放后的 QPixmap 设置给 QIcon,最后将 QIcon 设置给 QTableWidgetItem 的图标。 下面是一个示例代码,演示了如何设置 QIcon 的大小: 在示例代码中,我们加载原始图像

    2024年02月14日
    浏览(41)
  • Qt 设置软件图标

    文章目录 前言 一、设计图标文件 二、修改代码文件 1.方法一 2.方法二 三、生成可执行程序         程序发布通常会配有设计的独特的图标。这里介绍一下在 windows上设置Qt应用程序图标的方法。 一、设计图标文件 图标文件支持多种格式。其中.ico与.png应用较多。创建.

    2024年02月15日
    浏览(35)
  • qt添加图标

    1.添加资源 选择QtWidgetsApp.qrc文件打开 添加图标文件路径 添加图标文件 2.按钮添加图标   图标路径为:/res/res/swicth.jpg (1)代码设置图标          (2)属性编辑器设置  

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包