【问题标题】:Make a Qt/C++ program show its file types as known on Windows使 Qt/C++ 程序显示其在 Windows 上已知的文件类型
【发布时间】:2017-09-14 11:35:36
【问题描述】:

我使用 Qt 5.9 编写了一个电子表格程序,然后通过 Qt Installer Framework (QtIFW2.0.1) 为它创建了一个安装程序。然后我把程序发给了我的许多朋友。他们在他们的 Windows 机器上安装了该应用程序,现在正在使用它,但他们都有一个共同的问题:
当他们保存应用程序的文件时,这些文件在桌面上显示为“未知”文件。

问题只是存储文件的形状和外观而不是它们的功能,如果双击它们就会被应用程序打开。

问题是,需要对代码进行哪些更改才能让程序知道其文件的形状/外观?
例如,我们使用图像文件或类似文件为代码提供特定形状,以映射到存储的文件上,并且以这种方式显示它们是已知的。

【问题讨论】:

  • 我猜你所说的“未知”文件是关于文件扩展名的?!像“savedfile.mytype” 你想要这些文件在 Windows 资源管理器中的图标看起来不错吗?我说的对吗?
  • 是的。你是对的

标签: c++ qt installation qt-installer qt5.9


【解决方案1】:

这实际上与 Qt 或 C++ 本身无关。您只需在 Windows shell 中注册您的文件扩展名,以便其他 Windows 组件/shell 可以理解。

这里是关于windows下File Types and File Associations的一般信息。

您需要创建一些如下所示的 Windows 注册表项:

example.reg:

Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Classes\myfirm.myapp.v1\shell\open\command]
    @="c:\path\to\your\app.exe \"%1\""
    [HKEY_CURRENT_USER\Software\Classes\.myextension]
    @="myfirm.myapp.v1"

Here你可以阅读它的一般工作原理

myfirm.myapp.v1.myextension 和.exe 路径更改为您喜欢的名称。 现在 Windows 将知道您的应用应该打开哪些扩展名为 .myextension 的文件。如果您双击此文件,您的应用程序将以path to file 作为参数运行。您可以在 main() 函数中获取它

要为您的扩展程序设置图标,请在 Software\\Classes\\.myextension\\DefaultIcon 中添加注册表项并将其默认值设置为您的应用程序的完整路径,以便 Windows 可以从您的 .exe 应用程序文件中获取扩展程序的图标。

您也可以在运行时直接在您的应用中执行此操作:

QSettings s("HKEY_CURRENT_USER\\SOFTWARE\\CLASSES", QSettings::NativeFormat);

QString path = QDir::toNativeSeparators(qApp->applicationFilePath());
s.setValue(".myextension/DefaultIcon/.", path);
s.setValue(".myextension/.","myfirm.myapp.v1");
s.setValue("myfirm.myapp.v1/shell/open/command/.", QStringLiteral("\"%1\"").arg(path) + " \"%1\"");

编辑:另外,要使用 Qt 安装程序查看答案here

【讨论】:

  • 谢谢。我还没有完全阅读它,但我认为它希望我操纵注册表。那么,当我安装另一个应用程序时,为什么我不操纵注册表呢?这是因为该应用程序本身(通过其代码)而不是用户操作注册表。此外,假设我为无法进入注册表的普通用户发送应用程序,他们可以使用该应用程序做什么?我试着用最简单的英语句子表达这个问题:“我不希望我自己操纵注册表或任何东西,我想操纵应用程序,以便它本身为任何用户执行此操作,就像任何其他应用程序一样.
  • 你看完我的回答了吗?最后有一个 Qt 代码可以做到这一点。只需将这 4 行代码复制到您的应用程序代码中,然后将“myfirm.myapp.v1”和“.myextension”更改为您的值...
  • 好的,我读了你的回答,谢谢。我是否应该同时使用另一个线程中的脚本文件代码以及您在此处编写的代码?我在程序中有许多文件和函数,我使用的两个函数 QSettings 分别命名为 void MainWindow::readSettings()void MainWindow::writeSettings( )。请看at the code
  • 我使用了该代码和脚本文件的代码,但我的文件上还没有任何图标! :-(
  • 那是什么v1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2018-10-07
  • 2015-08-29
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多