2

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

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

virtual void fulltextsearch::clucene::QHelpSearchIndexWriter::run(): 由于 CLucene 异常而失败。

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

该错误是否与缺少索引文件创建权限有关?我怎样才能让 CLucene 写入用户文件夹呢?

谢谢

4

1 回答 1

3

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

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

Qt 助手通过不直接打开主 qhc 来处理这个问题。它将其复制到用户配置文件(在 windows 下,在 中C:\User\Username\appdata\Local\assistant)相应地更新.qch路径,然后打开此用户特定文件。

我实施了相同的方法,它就像一个魅力。您甚至不必qhc在安装程序中部署一个,您可以通过调用QHelpEngine不存在的路径直接创建一个,并qch使用注册文件registerDocumentation

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

  1. 创建一个QHelpEngine.qhc 文件的路径,该文件可能不存在,但在一个存在且可写的文件夹中。我用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
于 2015-09-25T10:00:49.520 回答