ホーム

OFF-SOFT.net

OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

Qt (8)-3 Qtヘルプファイルを表示する

公開日| 2009年06月26日 | コメントはまだありません。
概要 :
 Qtでは、WindowsでいうHTMLヘルプに変わるものとしてQtAssistantがあります。(先の記事でも記載しました。)
 前回の記事で、Qtヘルプファイル(qchファイル,qhcファイル)の作成を行いました。

 今回の記事では、Qtヘルプファイル(qchファイル,qhcファイル)をアプリケーションでどのように連動表示させるかについて記述します。

関連記事: Qt (8) QtAssistantのGUIの日本語化
関連記事: Qt (8)-2 QtAssistantで使うHELPファイルを作成する

関連記事: http://doc.trolltech.com/4.5/qthelp.html

ここで使用したサンプルソースコード:

ここで使用しているHelpBrowserクラスは、Nokiaの著作物です。
ソースコードに記載のライセンス条項を遵守してご利用ください。
QtAssistantを使って表示する
QtAssistantで表示させるのは、最も、一般的だと思います。
まずは、QtAssistantで表示させてみましょう。

以前のQtAssistantでは、表示のためのクラス(QAssistantClient)がありました。
これは、一応、今でも動作すようですが、推奨されていませんので、ここでは、使いません。

ここでは、推奨されているQtProcessを使った起動方法を簡単に記述します。
ここでのサンプルは、以下のファイルから構成されています。
  • sample.cpp
    -- mainプログラムです。MainWindowの画面を表示しているだけですので詳細な説明を省略します。
  • mainwindow.h
    -- QMainWindowを継承したMainWindowの画面ヘッダです。詳細な説明を省略します。
  • mainwindow.cpp
    -- MainWindowの画面のソースです。以降に詳細な説明をします。

使用するQtヘルプファイルは、QtAssistantで使うHELPファイルを作成するで作成した doc.qch,collection_doc.qhcを使います。

[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "mainwindow.h"
 
#define HELP_FILE "collection_doc.qhc"
 
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
{
	//	create menu.
	QMenu * pfileMenu = menuBar()->addMenu(tr("&File"));
	//	create status bar.
	QStatusBar *pstatus= statusBar();
	pstatus->showMessage(tr("Ready"));
 
	//	create action.
	m_help_act = pfileMenu->addAction("H&elp" );
	m_help_act->setShortcut(QKeySequence(QKeySequence::HelpContents));
	m_help_act->setStatusTip(tr("Show help"));
 
	m_help_change_act = pfileMenu->addAction("Change Page Help" );
	m_help_change_act->setStatusTip(tr("Change Page Help"));
	m_help_change_act->setEnabled(false);
 
	m_exit_act = pfileMenu->addAction(tr("E&xit" ));
	m_exit_act->setShortcut(tr("Ctrl+Q"));
	m_exit_act->setStatusTip(tr("Exit the application"));
 
	//	create help process.
	m_process_help = new QProcess(this);
	m_help_exec=false;
 
	//	action connect.
	connect(m_help_act, SIGNAL(triggered()), 
	         this, SLOT(OnHelp()));
	connect(m_help_change_act, SIGNAL(triggered()), 
	         this, SLOT(OnHelpChange()));
	connect(m_exit_act, SIGNAL(triggered()), 
	         qApp, SLOT(closeAllWindows()));
 
 
	connect(m_process_help,SIGNAL(started()),
			this,SLOT(OnStartedHelp()));
	connect(m_process_help,SIGNAL(finished(int , QProcess::ExitStatus )),
			this,SLOT(OnEndHelp(int , QProcess::ExitStatus )));
 
 
    setWindowTitle(tr("SampleWindow"));
	resize(400, 300);
}
 
void MainWindow::OnHelp()
{
	 QStringList args;
	 args <<   QLatin1String("-collectionFile")
	      << ( qApp->applicationDirPath() + "/" + HELP_FILE )
	      <<   QLatin1String("-enableRemoteControl");
	 m_process_help->start(QLatin1String("assistant"), args);
}
void MainWindow::OnHelpChange()
{
	QByteArray ba;
	ba.append("setSource qthelp://Sample_Help/doc/doc2.html");
	ba.append('\0');
	m_process_help->write(ba);
}
void MainWindow::OnStartedHelp()
{
	m_help_exec=true;
	statusBar()->showMessage(tr("Started HELP(Assistant)."));
	m_help_act->setEnabled(!m_help_exec);
	m_help_change_act->setEnabled(m_help_exec);
}
void MainWindow::OnEndHelp(int , QProcess::ExitStatus )
{
	m_help_exec=false;
	statusBar()->showMessage(tr("Closed HELP(Assistant)."));
	m_help_act->setEnabled(!m_help_exec);
	m_help_change_act->setEnabled(m_help_exec);
}

簡単に解説しておきます。
9 - 12行目は、メニュー、ステータスバーを作成しているところです。
15 - 25行目は、アクションを作成しているところです。
  • m_help_act:QtAssistantを起動するアクションです。
  • m_help_change_act:QtAssistantのページを切り替えるアクションです。
  • m_exit_act:アプリケーションを終了するアクションです。
27 - 28行目は、QtAssistantを起動するQProcessを作成しているところです。
50 - 57行目は、QProcessを使ってQtAssistantを起動しているところです。
詳細なコマンドパラメータについては、http://doc.trolltech.com/4.5/assistant-details.htmlを参照してください。

58 - 64行目は、QProcessを使ってQtAssistantのページを切り替えているところです。
詳細なコマンドパラメータについては、http://doc.trolltech.com/4.5/assistant-custom-help-viewer.htmlを参照してください。

65行目以降は、QtAssistantのプロセスが開始したら、ページ切り替えアクションを有効にしています。
QtAssistantのプロセスが終了したら、ページ切り替えアクションを無効にしています。

簡単ですね。
QProcessへパラメータを渡すときは、起動時は、QString(List)で実施(QtAssictantの起動パラメータをそのまま指定)しますが、 起動後は、プロセス間通信に切り替わりますから、QByteArray(QtAssictantのコマンドパラメータを指定)で引き渡します。


これをコンパイルして実行すると以下のような画面が表示されます。


メニューだけの簡単な画面です。

では、Fileメニューから、Helpをクリックしてみましょう。
以下のようにQtAssistantが表示されると思います。


続けて、Fileメニューから、Change Page Helpをクリックしてみましょう。
以下のようにQtAssistantの表示が切り替わったと思います。


ここでは、詳細な様々なコマンドについて、紹介をしませんでした。 コマンドで、ほとんどの画面操作ができるようです。
色々と試されると良いと思います。

詳細なコマンドパラメータ:http://doc.trolltech.com/4.5/assistant-custom-help-viewer.html

Qtヘルプファイル(qchファイル,qhcファイル)は、独自のQtアプリケーションの中で、表示させることもできます。
では、続けて、独自のQtアプリケーションでの表示について簡単に解説したいと思います。
独自のQtアプリケーションの中で表示する
以下のようなQtAssistantのような画面を作成してみましょう。


ここでのサンプルは、以下のファイルから構成されています。
  • sample.cpp
    -- mainプログラムです。MainWindowの画面を表示しているだけですので詳細な説明を省略します。
  • helpbrowser.h
    -- QTextBrowserを継承したHelpBrowserの画面ヘッダです。詳細な説明を省略します。
  • helpbrowser.cpp
    -- HelpBrowserの画面のソースです。以降に詳細な説明をします。
  • mainwindow.h
    -- QMainWindowを継承したMainWindowの画面ヘッダです。詳細な説明を省略します。
  • mainwindow.cpp
    -- MainWindowの画面のソースです。以降に詳細な説明をします。


[helpbrowser.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QHelpEngine>
#include "helpbrowser.h"
 
HelpBrowser::HelpBrowser(QHelpEngine *helpEngine, QWidget *parent)
    : QTextBrowser(parent), helpEngine(helpEngine)
{
}
 
QVariant HelpBrowser::loadResource(int type, const QUrl &url)
{
    if (url.scheme() == "qthelp")
        return QVariant(helpEngine->fileData(url));
    else
        return QTextBrowser::loadResource(type, url);
}

簡単に解説しておきます。
loadResourceをオーバーロードしているだけです。コンストラクタでQHelpEngineをもらう以外は、何も変更点がありません。
loadResourceのオーバーロードでは、QHelpEngineで、指定urlのHTMLドキュメントを探して、内容を返しています。

簡単ですね。

[mainwindow.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
 : QMainWindow(parent)
{
	//	create menu.
	QMenu * pfileMenu = menuBar()->addMenu(tr("&File"));
	//	create status bar.
	QStatusBar *pstatus= statusBar();
	pstatus->showMessage(tr("Ready"));
 
	//	create action
	m_exit_act = pfileMenu->addAction(tr("E&xit" ));
	m_exit_act->setShortcut(tr("Ctrl+Q"));
	m_exit_act->setStatusTip(tr("Exit the application"));
 
	QSplitter *helpPanel = new QSplitter(Qt::Horizontal,this);
 
	//	help engine.
	m_helpEngine=new QHelpEngine(qApp->applicationDirPath()+"/collection_doc.qhc",this);
	m_helpEngine->setupData();
	m_phtml=new HelpBrowser (m_helpEngine,this);
 
	helpPanel->insertWidget(0, m_helpEngine->contentWidget());
    helpPanel->insertWidget(1, m_phtml);
	setCentralWidget(helpPanel);
 
	//	action connect.
	connect(m_exit_act, SIGNAL(triggered()), 
	         qApp, SLOT(closeAllWindows()));
 
	connect(m_helpEngine->contentWidget(),
	        SIGNAL(linkActivated(const QUrl &)),
	        m_phtml, SLOT(setSource(const QUrl &)));
 
    setWindowTitle(tr("SampleWindow"));
	resize(400, 300);
}

簡単に解説しておきます。
7 - 10行目は、メニュー、ステータスバーを作成しているところです。
12 - 15行目は、アクションを作成しているところです。
  • m_exit_act:アプリケーションを終了するアクションです。
20 - 21行目は、QHelpEngineを作成しているところです。
collection_doc.qhcのフルパス情報を引数に渡しています。

22行目は、先のHelpBrowserを作成しているところです。
QHelpEngineを引数に渡しています。

32 - 34行目は、QHelpEngineのコンテンツ画面でリンク情報がクリックされたら、先のHelpBrowserのsetSourceを起動するようにconnectしています。

以外にシンプルに作成できます。

これをコンパイルして実行すると先の画面が表示されます。
コンパイル時は、以下のようにコマンドパラメータでQTHELPを取り込むか、.proへ追記する必要があります。
> qmake "CONFIG+=HELP"

ただし、ここで読めるQtヘルプファイルは、一部修正が必要となります。
QtAssistantで読み込むわけではありませんので、HELPプロジェクトコレクションファイル(.qhcp)のassistantタグを全て消去し、 Qtヘルプファイルを作り直す必要があります。

以外に簡単にできてしまうのに、少し驚きました。

ここでは、紹介しませんでしたが、まだまだ、QtHelp関連のクラスはあります。
例えば、QHelpSearchEngineでは、検索も行えます。

もっと、使いこなせば、QtAssistantの機能を自分のアプリケーションのうまく埋め込むことができます。



もっと、Qt関連について詳しく知りたい方は、以下の本なども良いと思います。
Qtに関する日本語の本が少ないですね。「入門書」は、さすがに、このページを読まれるくらいの方は不要だと思います。
やっぱり、本+ネット+試してみる!!の3本柱でやっていく以外にないように思います。


コメント

コメントをどうぞ







  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ