qt - QFileDialog 不显示字体文件夹

标签 qt qt5

我想浏览 c:\Windows 中的 Fonts 文件夹并获取所选字体的文件路径。

但是当对话框打开时,它不会显示 Windows 中的 Font 文件夹。

Void SumFont::FontChange()
{
    QString filePath = QFileDialog::getOpenFileName(NULL, tr("Open File"),
        "/home",
        tr("Fonts (*.ttf)"));

    QlineEditSetFont->setText(filePath);
    isChanged = true;
    stdstrLocation = filePath.toStdString();
    this->isChanged = true; 
}

最佳答案

在 Windows 上,字体文件夹除了以其他方式受到系统保护外,还通过以下行在 desktop.ini 中设置了特殊的字体显示模式:CLSID={BD84B380-8CA2- 1069-AB1D-08000948F534}。这使得 AppID {50d69d24-961d-4828-9d1c-5f4717f226d1} 负责在所有系统浏览器中显示此文件夹。不幸的是,Qt 中的 Windows 本地文件对话框无法将字体文件夹显示为正确的字体查看器(出于我未知的原因)。据我所知,有两种方法可以解决这个问题。

首先是扰乱 Windows 本身 - 只需将字体文件夹中的 desktop.ini 文件重命名为 desktop.ini.bak 即可。为此,您需要管理员权限,因此请从“以管理员身份”启动的 cmd 或 PowerShell 进行操作。此外,UAC 也可能必须关闭。之后,字体文件夹将成为常规文件夹,QFileDialog 将能够像任何其他文件夹一样显示它。在生产中确实不建议这样做,但我不知道为什么你需要直接访问字体文件夹。

第二种方法不使用 Windows 本地文件对话框。

QString filePath = QFileDialog::getOpenFileName(NULL, tr("Open File"),
        QStandardPaths::standardLocations(QStandardPaths::FontsLocation)[0],
        tr("Fonts (*.ttf);;Everything (*.*)"), nullptr,
        QFileDialog::DontUseNativeDialog);

上面的代码将打开 Qt 后备对话框,它不关心 desktop.ini

无论如何,直接访问字体文件夹时要小心。特别是如果您打算将文件放入其中。 Windows 可能有一些用于更新字体缓存的 Hook ,但这种方式可能无法正常工作。

关于qt - QFileDialog 不显示字体文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409788/

相关文章:

c++ - QMap 和 std::unique_ptr

c++ - Qt中有没有办法禁止计算机进入休眠状态?

qt - Runner::call: 上下文 -1 的套接字为空

windows - qt lrelease windows二进制文件?

c++ - 小部件仅在 for 循环结束时更新。我需要在 for 循环中逐步更新它

c++ - SQLITE:如何在 UPDATE 语句中使用 SELECT 语句更新表?

c++ - QTableWidget在单元格中有多行

c++ - 复杂类型的 QVector 与 std::vector

c++ - 在 Centos 中安装 QT - 安装 OpenBR 时的 CMake 警告

linux - Qt5库被误删