QFileDialog 未显示"字体"文件夹



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

但是,当对话框打开时,它不会在 Windows 中显示"字体"文件夹。

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.iniCLSID={BD84B380-8CA2-1069-AB1D-08000948F534}。这使得AppID {50d69d24-961d-4828-9d1c-5f4717f226d1}负责在所有系统浏览器中显示此文件夹。不幸的是,Qt中的Windows本机文件对话框无法将字体文件夹显示为正确的字体查看器(原因我不知道(。不过,我知道有两种方法可以解决此问题。

首先是弄乱 Windows 本身 - 只需将字体文件夹中的desktop.ini文件重命名为类似desktop.ini.bak.为此,您需要管理员权限,因此请从cmd或PowerShell"以管理员身份"启动。此外,UAC 可能必须关闭。之后,fonts 文件夹将成为常规文件夹,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 可能有一些用于更新字体缓存的钩子,这些钩子可能无法以这种方式正常工作。

相关内容

最新更新