Qtアシスタントのカスタマイズ

Qtアシスタントをカスタムヘルプビューワーとして使用するには、単にカスタムドキュメントを表示できるだけではありません。Qtアシスタントの外観をカスタマイズして、Qtアシスタントとしてではなく、アプリケーション固有のヘルプビューアとして見えるようにすることも同様に重要です。これは、ウィンドウのタイトルやアイコン、アプリケーション固有のメニュー・テキストやアクションを変更することで実現できます。可能なカスタマイズの完全なリストについては、カスタムヘルプコレクションファイルの作成を参照してください。

カスタムヘルプビューアのもう1つの要件は、ヘルプを提供するアプリケーションからアクションやコマンドを受け取る機能です。これは、アプリケーションがコンテキスト依存ヘルプを提供している場合に特に重要です。このように使用する場合、ヘルプビューアはアプリケーションが現在どのような状態にあるかによって内容を変更する必要があります。これは、アプリケーションが現在の状態をヘルプ・ビューワに伝える必要があることを意味します。詳細はQt Assistant をリモートで使用する を参照してください。

Simple Text Viewer の例では、このドキュメントで説明したテクニックを使用して、Qt Assistant をアプリケーションのカスタムヘルプビューアとして使用する方法を示します。

警告 Qt Assistant をアプリケーションに組み込むには、sqlite プラグインを組み込むことが重要です。アプリケーションにプラグインを含める方法の詳細については、デプロイメントのドキュメントを参照してください。

Qtヘルプ・コレクション・ファイル

Qt Assistant について知っておくべき最初の重要な点は、Qt Assistant の外観に関連するすべての設定と、インストールされているドキュメントのリストをヘルプ・コレクション・ファイルに保存することです。つまり、異なるコレクションファイルを使用してQt Assistantを起動した場合、Qt Assistantの外観はまったく異なるものになります。このように設定が完全に分離されているため、Qt Assistantの異なるインスタンス間で干渉する危険性がなく、Qt Assistantを1つのマシン上の複数のアプリケーション用のカスタムヘルプビューアとして配置することができます。

特定のヘルプ・コレクションをQt Assistantに適用するには、Qt Assistantを起動するときにコマンド・ラインでそれぞれのコレクション・ファイルを指定します。例えば、以下のようになります:

assistant -collectionFile mycollection.qhc

ただし、すべての設定を1つのコレクション・ファイルに保存すると、いくつかの問題が発生します。コレクション・ファイルは通常、アプリケーションと同じディレクトリか、そのサブディレクトリの1つにインストールされます。ディレクトリとオペレーティング・システムによっては、ユーザがこのファイルを変更する権限を持っていないかもしれません。また、ファイルが CD-ROM のような読み込み専用の媒体にある場合など、ユーザに書き込み権限を与 えることすらできないかもしれません。

グローバルに利用可能なコレクションファイルに自分の設定を保存する権利を全員に与えることが可能だとしても、あるユーザーの設定はQt Assistantを終了するときに他のユーザーによって上書きされてしまいます。

このジレンマを解決するために、Qt Assistantはオリジナルのコレクションファイルから多かれ少なかれコピーされたユーザー固有のコレクションファイルを作成します。ユーザー固有のコレクション・ファイルは、QDesktopServices::AppDataLocationによって返されるパスのサブディレクトリに保存されます。サブディレクトリ、またはこのユーザー固有の場所内のキャッシュディレクトリは、ヘルプ・コレクション・プロジェクト・ファイルで定義できます。たとえば、以下のようになります:

<?xml version="1.0" encoding="utf-8" ?>
<QHelpCollectionProject version="1.0">
    <assistant>
        <title>My Application Help</title>
        <cacheDirectory>mycompany/myapplication</cacheDirectory>
        ...
    </assistant>
</QHelpCollectionProject>

つまり

assistant -collectionFile mycollection.qhc

を呼び出すと、Qt Assistantは実際にコレクションファイルを使用します:

%QDesktopServices::AppDataLocation%/mycompany/myapplication/mycollection.qhc

ユーザー固有のコレクションファイルを使ってQt Assistantを起動する必要はありません。その代わりに、アプリケーションに同梱されているコレクションファイルを常に使用する必要があります。また、コレクションファイルからドキュメントを追加したり削除したりする場合(次のセクションを参照)には、常に通常のコレクションファイルを使用してください。インストールされているドキュメントのリストが変更された場合、Qt Assistantがユーザー・コレクション・ファイルの同期を行います。

カスタムドキュメントの表示

Qt Assistant がドキュメントを表示する前に、Qt Assistant は実際のドキュメントファイルがどこにあるかを知る必要があります。既に述べたように、Qt Assistantは圧縮ヘルプファイルへの参照を現在使用しているコレクションファイルに保存します。そのため、新しいコレクションファイルを作成するときに、Qt Assistantが表示すべきすべての圧縮ヘルプファイルをリストすることができます。

<?xml version="1.0" encoding="utf-8" ?>
<QHelpCollectionProject version="1.0">
    ...
    <docFiles>
        <register>
            <file>myapplication-manual.qch</file>
            <file>another-manual.qch</file>
        </register>
    </docFiles>
</QHelpCollectionProject>

Qt Assistantがヘルプ・ビューワとして動作するアプリケーションによっては、アプリケーション・コンポーネントやプラグインを追加インストールした場合など、時間の経過とともにドキュメントを追加する必要が生じることがあります。これは、Qt Assistantで「Edit(編集)」>「Preferences(環境設定)」>「 Documentation(ドキュメンテーション)」を選択して手動で行うことができます。しかし、この方法には、新しいドキュメントにアクセスするために、すべてのユーザーが手動で行う必要があるという欠点があります。

既に存在するコレクション・ファイルにドキュメントを追加するには、Qtアシスタントの-register コマンドラインフラグを使用するのが望ましい方法です。このフラグを使用してQt Assistantを起動すると、ドキュメントが追加され、登録が成功したかどうかのメッセージが表示され、Qt Assistantはすぐに終了します。

検索インデックスは、カスタム*.html、*.htm、および*.txtファイルのみをインデックスします。

assistant -collectionFile mycollection.qhc -register myapplication-manual.qch

-quiet フラグを Qt Assistant に渡すことで、ステータス・メッセージを表示しないようにすることができます。

注意: Qt Assistantは、登録された順番でドキュメントをContentsビューに表示します。

Qt アシスタントの外観を変更する

Qt Assistant の外観は、起動時にさまざまなコマンドラインオプションを渡すことで変更できます。ただし、これらのコマンドラインオプションで変更できるのは、コンテンツビューやインデックスビューのような特定のウィジェットの表示/非表示のみです。アプリケーションのタイトルやアイコンを変更したり、フィルター機能を無効にしたりといったその他のカスタマイズは、カスタム・ヘルプ・コレクション・ファイルを作成することで行うことができます。

カスタムヘルプコレクションファイルの作成

Qt Assistant で使用されるヘルプコレクションファイル (*.qhc) は、ヘルプコレクショ ンプロジェクトファイル (*.qhcp) に対してqhelpgenerator ツールを実行すると作成されます。プロジェクトファイルの形式は XML で、以下のタグをサポートしています:

タグ簡単な説明
<title>Qt Assistant のウィンドウ・タイトルを指定します。
<homePage>Qt Assistant のメイン・ウィンドウで「Home」を選択したときに表示するページを指定します。
<startPage>ヘルプ・コレクションを使用するときに最初に表示するページを指定します。
<currentFilter>最初に使用するフィルタを指定します。このフィルタを指定しないと、ドキュメントはフィルタされません。ドキュメント・セットが 1 つしかインストールされていない場合は、この影響はありません。
<applicationIcon>通常の Qt Assistant アプリケーション・アイコンの代わりに使用するアイコンを指定します。これは、コレクション・ファイルを含むディレクトリからの相対パスで指定します。
<enableFilterFunctionality>ユーザがアクセス可能なフィルタ機能を有効または無効にします。これにより、Qt Assistant の実行中にユーザがフィルタを変更できないようにすることができます。内部フィルター機能が完全に無効になるわけではありません。フィルタリングを無効にしたい場合は、値をfalse に設定してください。フィルターツールバーをデフォルトで表示する場合は、属性visibletrue に設定します。
<enableDocumentationManager>PreferencesダイアログのDocumentationタブを表示または非表示にします。ドキュメント・タブを無効にすると、Qt Assistant が特定のドキュメント・セットを表示するように制限したり、エンド・ユーザーが誤ってドキュメントを削除したりインストールしたりできないようにすることができます。ドキュメント・タブを非表示にするには、タグの値をfalse に設定します。
<enableAddressBar>アドレス・バーの機能を有効または無効にします。デフォルトでは有効になっています。無効にするには、タグ値をfalse に設定します。 アドレスバー機能が有効になっている場合、タグ属性visibletrue に設定することで、アドレスバーを表示することができます。
<aboutMenuText>, <text>ヘルプメニューの「バージョン情報」メニュー項目のローカライズバージョンを一覧表示します。例えば、「アプリケーションについて」です。テキストはtext タグ内で指定します。language 属性は二文字の言語名を取ります。言語属性が指定されていない場合、テキストはデフォルトのテキストとして使われます。
<aboutDialog>, <file>, <icon>ヘルプ]メニューから開くことができる[バージョン情報]ダイアログのテキストを指定します。テキストはfile タグ内のファイルから取得されます。別のファイルや任意の言語を指定することも可能です。icon タグで定義されたアイコンは、どの言語にも適用されます。
<cacheDirectory>, <cacheDirectory base="collection">全文検索に必要なインデックス・ファイルとコレクション・ファイルのコピーを保存するために使用されるキャッシュ・ディレクトリを指定します。Qt Assistant はすべての設定をコレクション・ファイルに保存するため、このコピーが必要です。ディレクトリは相対パスで指定します。base 属性が "collection "に設定されている場合、パスはコレクションファイルが存在するディレクトリへの相対パスとなります。属性が "default "に設定されている場合、または属性が見つからない場合、パスはQDesktopServices::AppDataLocationで指定されたディレクトリへの相対パスになります。最初の形式は、USBスティックで持ち運ぶなど、モバイルな方法で使用されるコレクションに便利です。
<enableFullTextSearchFallback>キーワードがインデックスで見つからない場合に、フォールバックして全文検索を使用する機能を有効または無効にします。この機能は、Qt Assistant のリモートコントロール中に使用できます。リモート・コントロールで使用するには、タグの値をtrue に設定します。

これらの Qt Assistant 固有のタグに加えて、ドキュメントの生成と登録用のタグも使用できます。詳細はQt Help Collection Files のドキュメントを参照してください。

利用可能なタグをすべて使用したヘルプ・コレクション・ファイルの例を以下に示します:

<?xml version="1.0" encoding="utf-8" ?>
<QHelpCollectionProject version="1.0">
    <assistant>
        <title>My Application Help</title>
        <startPage>qthelp://com.mycompany.1_0_0/doc/index.html</startPage>
        <currentFilter>myfilter</currentFilter>
        <applicationIcon>application.png</applicationIcon>
        <enableFilterFunctionality>false</enableFilterFunctionality>
        <enableDocumentationManager>false</enableDocumentationManager>
        <enableAddressBar visible="true">true</enableAddressBar>
        <cacheDirectory>mycompany/myapplication</cacheDirectory>
        <aboutMenuText>
            <text>About My Application</text>
            <text language="de">Über meine Applikation...</text>
        </aboutMenuText>
        <aboutDialog>
            <file>about.txt</file>
            <file language="de">ueber.txt</file>
            <icon>about.png</icon>
        </aboutDialog>
    </assistant>
    <docFiles>
        <generate>
            <file>
                <input>myapplication-manual.qhp</input>
                <output>myapplication-manual.qch</output>
            </file>
        </generate>
        <register>
            <file>myapplication-manual.qch</file>
        </register>
    </docFiles>
</QHelpCollectionProject>

バイナリ・コレクション・ファイルを作成するには、qhelpgenerator ツールを実行します:

qhelpgenerator mycollection.qhcp -o mycollection.qhc

生成されたコレクション・ファイルをテストするには、以下の方法で Qt Assistant を起動します:

assistant -collectionFile mycollection.qhc

Qt Assistant をリモートで使用する

ヘルプ・ビューワはスタンドアロン・アプリケーションですが、ほとんどの場合、ヘルプを提供するアプリケーションによって起動されます。この方法では、ヘルプ・ビューワが起動するとすぐに、特定のヘルプ・コンテンツを表示するようにアプリケーションに要求することができます。この方法のもう1つの利点は、アプリケーションがヘルプ・ビューワ・プロセスと通信できるため、アプリケーションの現在の状態に応じて他のヘルプ・コンテンツの表示を要求できることです。

そのため、Qt Assistantをアプリケーションのカスタム・ヘルプ・ビューアーとして使用するには、QProcessを作成してQt Assistant実行ファイルへのパスを指定するだけです。Qt Assistant に自分のアプリケーションの音を聞かせるには、-enableRemoteControl コマンド・ライン・オプションを指定して、Qt Assistant のリモート・コントロール機能をオンにします。

次の例は、この方法を示しています:

QProcess *process = new QProcess;
QStringList args;
args << QLatin1String("-collectionFile")
    << QLatin1String("mycollection.qhc")
    << QLatin1String("-enableRemoteControl");
process->start(QLatin1String("assistant"), args);
if (!process->waitForStarted())
    return;

Qt Assistant が実行されると、プロセスの標準入力チャネルを使用してコマンドを送信できます。以下のコード・スニペットは、ドキュメントの特定のページを表示するように Qt Assistant に指示する方法を示しています。

QByteArray ba;
ba.append("setSource qthelp://com.mycompany.1_0_0/doc/index.html\n");
process->write(ba);

注意: 入力の終わりを示すには、末尾に改行文字が必要です。

以下のコマンドを使用して、Qt Assistant を制御することができます:

コマンドコマンド
show <Widget><Widget>で指定されたサイドバーウィンドウ(ドックウィジェット)を表示します。ウィジェットが既に表示されている状態でこのコマンドを再度送ると、ウィジェットがアクティブになります。<Widget>に指定できる値は、"contents"、"index"、"bookmarks"、"search "のいずれかである。
hide <Widget><Widget>で指定されたドックウィジェットを非表示にします。<Widget>に指定できる値は "contents"、"index"、"bookmarks"、"search "です。
setSource <Url>指定された<URL>を表示します。URLは、現在表示されているページに対する絶対URLまたは相対URLのいずれかを指定します。絶対URLの場合は、有効なQtヘルプシステムのURLでなければなりません。つまり、"qthelp://"で始まるものです。
activateKeyword <Keyword>指定された<Keyword>をインデックスドックウィジェットの行編集に挿入し、インデックスリストの対応する項目をアクティブにします。そのような項目に複数のリンクが関連付けられている場合、トピック選択ツールが表示される。
activateIdentifier <Id>指定された<ID>のヘルプを表示します。IDは各名前空間で一意であり、関連するリンクは1つだけなので、トピックセレクタがポップアップすることはありません。
syncContents現在表示されているページに対応するコンテンツ・ウィジェットの項目を選択します。
setCurrentFilter <filter>指定されたフィルタを選択し、それに応じて視覚表現を更新します。
expandToc <Depth>目次ツリーを指定された深さまで展開します。深さが0の場合、ツリーは完全に折りたたまれます。depth が -1 の場合、ツリーは完全に展開されます。
register <help file>与えられた Qt 圧縮ヘルプファイルをコレクションに追加します。
unregister <help file>指定された Qt 圧縮ヘルプファイルをコレクションから削除します。

短時間に複数のコマンドを送信する場合は、コマンドごとに1行ではなく、プロセスの標準入力に1行だけ書き込むことをお勧めします。以下の例のように、コマンドはセミコロンで区切る必要があります:

QByteArray ba;
ba.append("hide bookmarks;");
ba.append("hide index;");
ba.append("setSource qthelp://com.mycompany.1_0_0/doc/index.html\n");
process->write(ba);

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。