在已安装的应用程序中使用Qt帮助文件



我为windows开发了一个Qt应用程序,帮助文件是用qch集合文件以qch格式生成的。使用QHelpEngine将帮助嵌入到应用程序中。帮助文件与应用程序可执行文件放在同一个文件夹中,这对开发构建非常有效。

但是,当我们使用WiX安装程序在"程序文件"中部署应用程序时,文档可以工作,但搜索功能失败,我收到警告:

虚拟void全文搜索::clucene::QHelpSearchIndexWriter::run((:由于CLucene异常而失败。

在开发版本中,CLucene似乎在帮助文件文件夹中创建了一些索引文件。在这里它不能,因为帮助文件在安装文件夹中,而标准用户不能在那里写入。

该错误是否与缺少索引文件创建权限有关?如何使CLucene写入User文件夹?

感谢

我通过查看辅助源代码找到了解决方案。

CLucene总是将其缓存写入与.qhc 相同的文件夹

Qt Assistant通过不直接打开主qhc来处理此问题。它将其复制到用户配置文件(在窗口下,在C:UserUsernameappdataLocalassistant中(,相应地更新.qch路径,然后打开此用户特定的文件。

我采用了同样的方法,效果很好。您甚至不必在安装程序中部署qhc,您可以通过使用不存在的路径调用QHelpEngine直接创建一个,并使用registerDocumentation 注册qch文件

所以我找到的最好的方法是:

  1. 使用.qhc文件的路径创建QHelpEngine,该文件可能不存在,但位于存在且可写的文件夹中。我使用QStandardPaths::CacheLocation。如果需要,Qt将创建一个.qhc文件,或者再次打开它
  2. 遍历所有.qch文件,并检查它们是否已使用engine->registeredDocumentations()注册
  3. 对于未登记的文件,请向engine->registerDocumentation登记
  4. 您的发动机已准备就绪

这是我的代码和一个qch文件:

QString collPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
QDir().mkpath(collPath);
collPath.append("/myapp.qhc");
engine = new QHelpEngine(collPath, this);
engine->setupData();
QString docPath = QApplication::applicationDirPath()+"/myapp.qch";
docNS = QHelpEngineCore::namespaceName(docPath);
if(docNS.isEmpty() || !engine->registeredDocumentations().contains(docNS))
{
    if(engine->registerDocumentation(docPath))
    {
        qInfo("Registered documentation %s", qPrintable(docPath));
    }
    else
    {
        qWarning("Could not register documentation file %s", qPrintable(docPath));
        qWarning("Help engine error : %s", qPrintable(engine->error()));
    }
}
//Now you can use "engine" in a text browser

最新更新