Qt 之 QFileIconProvider

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

QFileIconProvider类为QDirModel和QFileSystemModel类提供了文件图标。

共有类型

枚举QFileIconProvider::IconType:

常量
QFileIconProvider::Computer0
QFileIconProvider::Desktop1
QFileIconProvider::Trashcan2
QFileIconProvider::Network3
QFileIconProvider::Drive4
QFileIconProvider::Folder5
QFileIconProvider::File6

枚举QFileIconProvider::Option:
标记QFileIconProvider::Options:

常量描述
QFileIconProvider::DontUseCustomDirectoryIcons0x00000001始终使用默认的目录图标。有些平台允许用户设置不同的图标,自定义图标在网络或可移动驱动上查找会造成一个很大的性能影响。

公共函数

  • QIcon icon(IconType type) const
    获取IconType图标类型对应的图标。

  • QIcon icon(const QFileInfo & info) const
    获取QFileInfo文件信息对应的图标。

  • Options options() const
    获取所有影响QFileIconProvider的选项。默认情况下,所有选项被禁用。

  • void QFileIconProvider::setOptions(Options options)
    设置所有影响QFileIconProvider的选项。

  • QString type(const QFileInfo & info) const
    获取QFileInfo文件信息对应的类型描述。

示例

IconType

获取IconType图标类型对应的图标:

效果

这里写图片描述

源码

QListWidget *pListWidget = new QListWidget(this);
pListWidget->setIconSize(QSize(48, 48));         // 设置单元项图片大小
pListWidget->setResizeMode(QListView::Adjust);   // 设置大小模式-可调节
pListWidget->setViewMode(QListView::IconMode);   // 设置显示模式
pListWidget->setMovement(QListView::Static);     // 设置单元项不可被拖动
pListWidget->setSpacing(10);                     // 设置单元项间距
for (int i = 0; i <= 6; ++i)
{
    // 获取图标
    QFileIconProvider provider;
    QIcon icon = provider.icon((QFileIconProvider::IconType)i);

    // 添加单元项
    QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
    pItem->setIcon(icon);
    pListWidget->addItem(pItem);
}

QFileInfo

获取QFileInfo文件信息对应的图标、类型描述:

效果

这里写图片描述

源码

QStringList strList;
strList << QString::fromLocal8Bit("新建文件夹") << QString::fromLocal8Bit("新建公文包")
        << QString::fromLocal8Bit("不存在此文件.exe") << QString::fromLocal8Bit("新建 360压缩 ZIP 文件.zip")
        << QString::fromLocal8Bit("新建 HTTP Archive File.har") << QString::fromLocal8Bit("新建 HttpWatch Log File.hwl")
        << QString::fromLocal8Bit("新建 Microsoft Access 数据库.accdb") << QString::fromLocal8Bit("新建 Microsoft Excel 工作表.xlsx")
        << QString::fromLocal8Bit("新建 Microsoft PowerPoint 演示文稿.pptx") << QString::fromLocal8Bit("新建 Microsoft Word 文档.docx")
        << QString::fromLocal8Bit("新建日记本文档.jnt") << QString::fromLocal8Bit("新建文本文档.txt");

for (int i = 0; i < strList.count(); ++i)
{
    QFileInfo info;
    info.setFile(QString("E:\\%1").arg(strList.at(i)));

    // 获取图标、类型
    QFileIconProvider provider;
    QIcon icon = provider.icon(info);
    QString strType = provider.type(info);

    // 添加单元项
    QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
    pItem->setIcon(icon);
    pItem->setText(strType);
    pListWidget->addItem(pItem);
}

这里需要注意,如果要获取文件相关的信息 - 图标、类型,那么,本地必须存在这些文件。如果不存在,那么图标不会显示,而且类型会变为Unknow(如图:不存在此文件.exe)。

那么,如果想要通过不存在的文件获取相关的信息该如何处理呢?下节我们分享。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
要使QFileIconProvider().icon()的底色为透明且颜色为黑色,可以通过创建一个自定义的QFileIconProvider类来实现。以下是一个示例代码: ```cpp #include <QFileIconProvider> #include <QPainter> class CustomIconProvider : public QFileIconProvider { public: QIcon icon(const QFileInfo &info) const override { QIcon originalIcon = QFileIconProvider::icon(info); QPixmap pixmap = originalIcon.pixmap(QSize(16, 16)); QImage image = pixmap.toImage(); image.convertToFormat(QImage::Format_ARGB32); for (int y = 0; y < image.height(); ++y) { QRgb *scanLine = reinterpret_cast<QRgb *>(image.scanLine(y)); for (int x = 0; x < image.width(); ++x) { if (qAlpha(scanLine[x]) > 0) scanLine[x] = qRgba(0, 0, 0, qAlpha(scanLine[x])); } } return QIcon(QPixmap::fromImage(image)); } }; ``` 在这个示例中,我们创建了一个名为CustomIconProvider的自定义类,继承自QFileIconProvider。我们重写了icon()函数,以便在获取文件图标时对其进行自定义处理。 在重写的icon()函数中,我们首先获取原始的图标,并将其转换为16x16大小的QPixmap。然后,我们将该QPixmap转换为一个QImage,并将其格式设置为ARGB32,以便支持透明色。 接下来,我们遍历图像的每个像素点,并将不透明的像素点的颜色设置为黑色,同时保留原始像素的透明度(alpha 值)。 最后,我们使用修改后的QImage创建一个新的QPixmap,并将其作为一个QIcon返回。 使用这个自定义的QFileIconProvider类替代默认的文件图标提供程序后,QFileIconProvider().icon()将返回具有透明底色且颜色为黑色的图标

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值