Использование файла справки Qt в установленном приложении
Я разрабатываю приложение Qt для Windows, и файл справки был сгенерирован в формате qch с файлом коллекции qhc. Помощь была встроена в приложение с использованием QHelpEngine. Файлы справки находятся в той же папке, что и исполняемый файл приложения, и это хорошо работает для сборок dev.
Но когда мы развертываем приложение в "Program Files" с помощью установщика WiX, документация работает, но функция поиска не работает, и я получаю предупреждение:
virtual void fulltextsearch:: clucene:: QHelpSearchIndexWriter:: run (): не удалось из-за исключения CLucene.
В сборке dev кажется, что CLucene создает некоторые индексные файлы в папке справочного файла. Здесь это невозможно, поскольку файл справки находится в папке установки, и обычный пользователь не может писать туда.
Связана ли ошибка с отсутствующими правами на создание файла индекса? Как я могу заставить CLucene записывать в папку User вместо этого?
Спасибо
1 ответ
Я нашел решение, изучив исходный код помощника.
CLucene всегда записывает свой кеш в ту же папку, что и.qhc
Qt Assistant обрабатывает это, не открывая основной qhc напрямую. Копирует его в профиль пользователя (под windows, в C:\User\Username\appdata\Local\assistant
) обновление .qch
пути соответственно, а затем откройте этот пользовательский файл.
Я реализовал тот же подход, и он работает как шарм. Вам даже не нужно развертывать qhc
в установщике вы можете напрямую создать его, вызвав QHelpEngine
с путем, который не существует, и зарегистрировать qch
файлы, использующие registerDocumentation
Итак, лучший способ, который я нашел, это:
- Создать
QHelpEngine
с путем к файлу.qhc, который может не существовать, но в папке, которая существует и доступна для записи. я использую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