2

Windows 用の Qt アプリケーションを開発しましたが、ヘルプ ファイルは qhc コレクション ファイルを使用して qch 形式で生成されました。ヘルプは、QHelpEngine を使用してアプリケーションに埋め込まれました。ヘルプ ファイルは、アプリケーションの実行可能ファイルと同じフォルダーに配置されます。これは開発ビルドに適しています。

しかし、WiX インストーラーを使用して「Program Files」にアプリケーションを展開すると、ドキュメントは機能しますが、検索機能は失敗し、次の警告が表示されます。

virtual void fulltextsearch::clucene::QHelpSearchIndexWriter::run(): CLucene 例外のため失敗しました。

dev ビルドでは、CLucene がヘルプ ファイル フォルダーにいくつかのインデックス ファイルを作成しているようです。ヘルプファイルはインストールフォルダーにあり、標準ユーザーはそこに書き込むことができないため、ここではできません。

このエラーは、インデックス ファイルの作成権限がないことに関連していますか? 代わりに CLucene を User フォルダに書き込むにはどうすればよいですか?

ありがとう

4

1 に答える 1

3

アシスタントのソースコードを調べて解決策を見つけました。

CLucene は常にキャッシュを .qhc と同じフォルダーに書き込みます。

Qt Assistant は、メインの qhc を直接開かないことでこれを処理します。それをユーザー プロファイルにコピーし (Windows では、 でC:\User\Username\appdata\Local\assistant)、それに応じてパスを更新し、.qchこのユーザー固有のファイルを開きます。

私は同じアプローチを実装しましたが、それは魅力のように機能します。インストーラーに展開する必要さえありません。存在しないパスをqhc呼び出して直接作成し、次を使用してファイルを登録できます。QHelpEngineqchregisterDocumentation

だから私が見つけた最良の方法は次のとおりです。

  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 に答える