Использование файла справки 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

Итак, лучший способ, который я нашел, это:

  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
Другие вопросы по тегам