在已安装的应用程序中使用 Qt 帮助文件
Using a Qt Help file in an installed app
我为windows开发了一个Qt应用程序,帮助文件是用qhc集合文件生成的qch格式。使用 QHelpEngine 将帮助嵌入到应用程序中。帮助文件与应用程序可执行文件放在同一个文件夹中,这对开发版本很有效。
但是当我们使用 WiX 安装程序在 "Program Files" 中部署应用程序时,文档有效但搜索功能失败,我收到警告:
virtual void fulltextsearch::clucene::QHelpSearchIndexWriter::run():
Failed because of CLucene exception.
在开发版本中,CLucene 似乎在帮助文件夹中创建了一些索引文件。这里不行,因为帮助文件在安装文件夹里,普通用户不能写。
错误是否与缺少索引文件创建权限有关?我怎样才能让 CLucene 改为写入用户文件夹?
谢谢
我通过查看助手源代码找到了解决方案。
CLucene 始终将其缓存写入与 .qhc 相同的文件夹
Qt 助手通过不直接打开主 qhc 来处理这个问题。它将其复制到用户配置文件(在 windows 下,在 C:\User\Username\appdata\Local\assistant
中)相应地更新 .qch
路径,然后打开该用户特定文件。
我采用了相同的方法,效果非常好。您甚至不必在安装程序中部署 qhc
,您可以通过使用不存在的路径调用 QHelpEngine
直接创建一个,并使用 [= 注册 qch
文件16=]
所以我找到的最好方法是:
- 使用 .qhc 文件的路径创建一个
QHelpEngine
,该文件可能不存在,但位于存在且可写的文件夹中。为此,我使用 QStandardPaths::CacheLocation
。如果需要,Qt 将创建一个 .qhc 文件,或者再次打开它。
- 遍历所有 .qch 文件并检查它们是否已使用
engine->registeredDocumentations()
注册
- 未注册的文档,用
engine->registerDocumentation
注册
- 您的引擎可以使用了
这是我的代码,只有一个 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
我为windows开发了一个Qt应用程序,帮助文件是用qhc集合文件生成的qch格式。使用 QHelpEngine 将帮助嵌入到应用程序中。帮助文件与应用程序可执行文件放在同一个文件夹中,这对开发版本很有效。
但是当我们使用 WiX 安装程序在 "Program Files" 中部署应用程序时,文档有效但搜索功能失败,我收到警告:
virtual void fulltextsearch::clucene::QHelpSearchIndexWriter::run(): Failed because of CLucene exception.
在开发版本中,CLucene 似乎在帮助文件夹中创建了一些索引文件。这里不行,因为帮助文件在安装文件夹里,普通用户不能写。
错误是否与缺少索引文件创建权限有关?我怎样才能让 CLucene 改为写入用户文件夹?
谢谢
我通过查看助手源代码找到了解决方案。
CLucene 始终将其缓存写入与 .qhc 相同的文件夹
Qt 助手通过不直接打开主 qhc 来处理这个问题。它将其复制到用户配置文件(在 windows 下,在 C:\User\Username\appdata\Local\assistant
中)相应地更新 .qch
路径,然后打开该用户特定文件。
我采用了相同的方法,效果非常好。您甚至不必在安装程序中部署 qhc
,您可以通过使用不存在的路径调用 QHelpEngine
直接创建一个,并使用 [= 注册 qch
文件16=]
所以我找到的最好方法是:
- 使用 .qhc 文件的路径创建一个
QHelpEngine
,该文件可能不存在,但位于存在且可写的文件夹中。为此,我使用QStandardPaths::CacheLocation
。如果需要,Qt 将创建一个 .qhc 文件,或者再次打开它。 - 遍历所有 .qch 文件并检查它们是否已使用
engine->registeredDocumentations()
注册
- 未注册的文档,用
engine->registerDocumentation
注册
- 您的引擎可以使用了
这是我的代码,只有一个 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