[Qt教程] 第47篇 进阶(七) 定制Qt帮助系统

[Qt教程] 第47篇
进阶(七) 定制Qt帮助系统

楼主

 发表于 2013-10-7 09:32:39 | 查看:
93| 回复: 0


定制Qt帮助系统

版权声明


该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!

导语


       一个完善的应用程序应该提供尽可能丰富的帮助信息。在Qt中可以使用工具提示、状态提示以及“What’s This”等简单的帮助提示,也可以使用QtAssistant来提供强大的在线帮助。如果要进行详细的功能和使用的介绍,单单使用这些提示信息是不行的,这就需要提供HTML格式的帮助文本。在程序中可以通过调用Web浏览器或者使用QTextBrowser来管理和应用这些HTML文件。不过,Qt提供了更加强大的工具,那就是Qt
Assistant,它支持索引和全文检索,而且可以为多个应用程序同时提供帮助,我们可以通过定制Qt Assistant来实现强大的在线帮助系统。

       为了将Qt Assistant定制为我们自己的应用程序的帮助浏览器,需要先进行一些准备工作,主要是生成一些文件,最后再在程序中启动Qt Assistant。主要的步骤如下:

1.创建HTML格式的帮助文档;

2.创建Qt帮助项目(Qt help project).qhp文件,该文件是XML格式的,用来组织文档,并且使它们可以在Qt Assistant中使用;

3.生成Qt压缩帮助(Qt compressed help).qch文件,该文件由.qhp文件生成,是二进制文件;

4.创建Qt帮助集合项目(Qt help collection project).qhcp文件,该文件是XML格式的,用来生成下面的.qhc文件;

5.生成Qt帮助集合(Qt help collection).qhc文件,该文件是二进制文件,可以使Qt Assistant只显示一个应用程序的帮助文档,也可以定制Qt Assistant的外观和一些功能;

6.在程序中启动Qt Assistant。

环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0

目录


一、创建HTML格式的帮助文档

二、创建.qhp文件

三、生成.qch文件

四、创建.qhcp文件

五、生成.qhc文件

六、在程序中启动QtAssistant

正文


一、创建HTML格式的帮助文档

1.新建Qt Gui应用,项目名称为“myWhatsThis”,类名为“MainWindow”,基类保持QMainWindow不变。

2.然后可以通过各种编辑器例如Microsoft Word来编辑要使用的文档,最后保存为HTML格式的文件,例如这里我们创建了5个HTML文件。然后在项目目录中新建文件夹,命名为“documentation”,再将这些HTML文件放入其中。再在documentation文件夹中再新建一个“images”文件夹,往里面复制一个图标图片,以后将作为Qt
Assistant的图标,例如这里使用了yafeilinux.png图片。

二、创建.qhp文件

首先在documentation文件夹中创建一个文本文件,然后进行编辑,最后另存为“myHelp.qhp”,注意后缀为.qhp。文件的内容如下:

<?xml version="1.0"encoding="GB2312"?>

<QtHelpProjectversion="1.0">

<namespace>yafeilinux.myHelp</namespace>

<virtualFolder>doc</virtualFolder>

<filterSection>

   <toc>

     <section title="我的帮助"ref="./index.html">

       <section title="关于我们"ref="./aboutUs.html">

         <section title="关于yafeilinux"ref="./about_yafeilinux.html"></section>

         <section title="关于Qt Creator系列教程" ref="./about_QtCreator.html"></section>

       </section>

       <section title="加入我们"ref="./joinUs.html"></section>

     </section>

   </toc>

   <keywords>

     <keyword name="关于"ref="./aboutUs.html"/>

     <keyword name="yafeilinux" ref="./about_yafeilinux.html"/>

     <keyword name="Qt Creator"ref="./about_QtCreator.html"/>

   </keywords>

   <files>

     <file>about_QtCreator.html</file>

     <file>aboutUs.html</file>

     <file>about_yafeilinux.html</file>

     <file>index.html</file>

     <file>joinUs.html</file>

     <file>images/*.png</file>

   </files>

</filterSection>

</QtHelpProject>

       这个.qhp文件是XML格式的,对于XML格式不是这里介绍的重点,我们主要讲解其中的内容,如果大家想了解XML格式相关的知识,可以参考这里。在第一行是XML序言,这里指定了编码encoding为GB2312,这样就可以使用中文了,如果只想使用英文,那么编码一般是UTF-8;第二行指定了QtHelpProject版本为1.0;第三行指定了命名空间namespace,每一个.qhp文件的命名空间都必须是唯一的,命名空间会成为Qt
Assistant中的页面的URL的第一部分,这个在后面的内容中会涉及到;第四行指定了一个虚拟文件夹virtualFolder,这个文件夹并不需要创建,它只是用来区分文件的;再下面的过滤器部分filterSection标签包含了目录表、索引和所有文档文件的列表。过滤器部分可以设置过滤器属性,这样以后可以在Qt
Assistant中通过过滤器来设置文档的显示有否,不过,因为我们这里只有一个文档,所以不需要Qt Assistant的过滤器功能,这里也就不需要设置过滤器属性;在目录表toc(table
ofcontents)标签中创建了所有HTML文件的目录,指定了它们的标题和对应的路径,这里设定的目录表为:

  我的帮助
      关于我们

             关于yafeilinux

             关于Qt Creator系列教程

    加入我们

然后是keywords标签,它指定了所有索引的关键字和对应的文件,这些关键字会显示在Qt Assistant的索引页面;在files标签中列出了所有的文件,也包含图片文件。

三、生成.qch文件

       这里为了测试创建的文件是否可用,可以先生成.qch文件,然后在QtAssistant中注册它。这样运行QtAssistant就会看到我们添加的文档了。不过,这一步不是必须的。我们打开命令行控制台,然后使用cd命令跳转到项目目录的documentation目录中,分别输入下面的命令后按下回车:

qhelpgeneratormyHelp.qhp –o myHelp.qch

assistant –registermyHelp.qch

       要保证命令可以正常运行,前提是已经将Qt安装目录的bin目录的路径添加到了系统的PATH环境变量中。命令运行结果如下图所示。

当注册成功时,会显示“Documentationsuccessfully registered”提示对话框。这时在开始菜单中启动Qt Assistant(或者直接在命令行输入assistant来启动Qt
Assistant),可以发现已经出现了我们的HTML文档,如下图所示。

四、创建.qhcp文件

要想使Qt Assistant只显示我们自己的帮助文档的最简单的方法就是生成帮助集合文件即.qhc文件,要生成.qhc文件,首先要创建.qhcp文件。在documentation文件夹中新建文本文档,对其进行编辑,最后另存为“myHelp.qhcp”,注意后缀为.qhcp。这里还要创建一个名为“about.txt”的文本文件,在其中输入一些该帮助的说明信息,作为QtAssistant的About菜单的显示内容。myHelp.qhcp文件的内容如下:

<?xml version="1.0"encoding="GB2312"?>

<QHelpCollectionProjectversion="1.0">

<assistant>

<title>我的帮助系统</title>

<applicationIcon>images/yafeilinux.png</applicationIcon>

<cacheDirectory>cache/myHelp</cacheDirectory>

<homePage>qthelp://yafeilinux.myHelp/doc/index.html</homePage>

<startPage>qthelp://yafeilinux.myHelp/doc/index.html</startPage>

<aboutMenuText>

   <text>关于该帮助</text>

</aboutMenuText>

<aboutDialog>

   <file>./about.txt</file>

   <icon>images/yafeilinux.png</icon>

</aboutDialog>

<enableDocumentationManager>false</enableDocumentationManager>

<enableAddressBar>false</enableAddressBar>

<enableFilterFunctionality>false</enableFilterFunctionality>

</assistant>

<docFiles>

<generate>

   <file>

     <input>myHelp.qhp</input>

     <output>myHelp.qch</output>

   </file>

</generate>

<register>

   <file>myHelp.qch</file>

</register>

</docFiles>

</QHelpCollectionProject>

       在assistant标签中是对Qt Assistant的外观和功能的定制,其中设置了标题、图标、缓存目录、主页、起始页、About菜单文本、关于对话框的内容和图标等,还关闭了一些没有用的功能。对于缓存目录cacheDirectory,是进行全文检索等操作时缓存文件要存放的位置。对于主页homePage和起始页startPage,这里使用了第二步中提到的Qt
Assistant的页面的URL,这个URL由“qthelp://”开始,然后是在.qhp文件中设置的命名空间,然后是虚拟文件夹,最后是具体的HTML文件名。因为Qt
Assistant可以添加或者删除文档来为多个应用程序提供帮助,但是这里只是为一个应用程序提供帮助,并且不希望删除我们的文档,所以禁用了文档管理器documentation manager;因为这里的文档集很小,而且只有一个过滤器部分,所以也关闭了地址栏address bar和过滤器功能filter
functionality。

       在前面第三步中我们已经生成了.qch文件并且在Qt Assistant中进行了注册,但那只是为了测试文件是否可用,其实完全可以跳过第三步,因为在这里的docFiles标签中就完成了第三步的操作。不过与第三步不同的是,第三步是在默认的集合文件中注册的,而这里是在我们自己的集合文件中注册的。

五、生成.qhc文件

在命令行输入如下命令:

qcollectiongenerator myHelp.qhcp –omyHelp.qhc

       输出结果如下图所示。

为了测试我们定制的QtAssistant,可以在输入如下命令:

assistant –collectionFile myHelp.qhc

这里在运行Qt Assistant时指定了集合文件为我们自己的.qhc文件,所以运行后只会显示我们自己的HTML文档。可以看到,现在QtAssistant的图标也更改了,打开“Help”菜单中的“关于该帮助”菜单,这里是前面添加的about.txt文件的内容,效果如下图所示。

六、在程序中启动Qt Assistant

这里先要将Qt安装目录的bin目录中的assistant.exe程序复制到我们项目目录的documentation目录中。为了启动Qt Assistant,先要创建了一个Assistant类。首先向项目中添加新文件,模板选择C++ Class,类名为“Assistant”,基类不填写,类型信息选择无。然后将assistant.h文件更改如下:

#ifndef ASSISTANT_H

#define ASSISTANT_H

#include <QtCore/QString>

class QProcess;

class Assistant

{

public:

    Assistant();

    ~Assistant();

    void showDocumentation(const
QString &file);

private:

    bool startAssistant();

    QProcess *proc;

};

#endif // ASSISTANT_H

       在Assistant类中主要是使用QProcess类创建一个进程来启动Qt
Assistant。下面是assistant.cpp文件的内容:

#include <QtCore/QByteArray>

#include <QtCore/QProcess>

#include <QtGui/QMessageBox>

#include "assistant.h"

Assistant::Assistant()

   : proc(0)

{

}

Assistant::~Assistant()

{

   if (proc && proc->state()
== QProcess::Running) {

       // 试图终止进程

       proc->terminate();

       proc->waitForFinished(3000);

   }

   // 销毁proc

   delete proc;

}

// 显示文档

void Assistant::showDocumentation(const
QString &page)

{

   if (!startAssistant())

       return;

   QByteArray ba("SetSource ");

   ba.append("qthelp://yafeilinux.myHelp/doc/");

   proc->write(ba
+ page.toLocal8Bit() + '\n');

}

// 启动Qt Assistant

bool Assistant::startAssistant()

{

   // 如果没有创建进程,则新创建一个

   if (!proc)

       proc = new QProcess();

   // 如果进程没有运行,则运行assistant,并添加参数

   if (proc->state()
!= QProcess::Running) {

     QString app = QLatin1String("../myWhatsThis/documentation/assistant.exe");

       QStringList args;

       args << QLatin1String("-collectionFile")

            << QLatin1String("../myWhatsThis/documentation/myHelp.qhc");

       proc->start(app,
args);

       if (!proc->waitForStarted())
{

            QMessageBox::critical(0,
QObject::tr("my help"),

                QObject::tr("Unable
to launch Qt Assistant (%1)").arg(app));

            return false;

       }

   }

   return true;

}

       在startAssistant()函数中使用QProcess创建了一个进程来启动Qt
Assistant,这里使用了命令行参数来使用帮助集合文件,对于assistant.exe和myHelp.qhc都使用了相对地址;在showDocumentation()函数中可以指定具体的页面作为参数来使Qt
Assistant显示指定的页面;在析构函数中,如果进程还在运行,则终止进程,最后销毁了进程指针。

       下面来使用Assistant类来启动Qt Assistant。在mainwindow.h文件中先添加前置声明:

class Assistant;

       再添加private对象指针声明:

Assistant *assistant;

       然后添加一个私有槽:

private slots:

    void startAssistant();

       现在到mainwindow.cpp文件中进行更改。添加头文件包含#include "assistant.h",然后在构造函数中添加如下代码:

QAction *help = new QAction("help",this);

ui->mainToolBar->addAction(help);

connect(help, SIGNAL(triggered()), this, SLOT(startAssistant()));

// 创建Assistant对象

assistant = new Assistant;

       这里创建了一个“help”动作,并将它添加到了工具栏中,可以使用该动作启动QtAssistant。下面是startAssistant()槽的定义:

void MainWindow::startAssistant()

{

   // 按下“help”按钮,运行Qt Assistant,显示index.html页面

   assistant->showDocumentation("index.html");

}

       最后在析构函数中销毁assistant指针,即在MainWindow::~MainWindow()函数中添加如下代码:

// 销毁assistant

delete assistant;

       现在运行程序,按下工具栏上的“help”动作,就可以启动Qt Assistant了。这里还要提示一下,如果要发布该程序,那么需要将documentation目录复制到发布目录中,这时运行程序。

结语


使用Qt定制帮助系统,可以制作功能强大的上下文相关的帮助文档,而对于一个优秀的软件而言,帮助菜单是必须有的。



涉及到的代码:  myWhatsThis.rar (642.58
KB, 下载次数: 0) 
时间: 2024-07-28 22:38:34

[Qt教程] 第47篇 进阶(七) 定制Qt帮助系统的相关文章

[Qt教程] 第45篇 进阶(五)Qt样式表

[Qt教程] 第45篇 进阶(五)Qt样式表 楼主  发表于 2013-9-13 15:43:55 | 查看: 329| 回复: 1 Qt样式表 版权声明 该文章原创于Qter开源社区 导语 一个完善的应用程序不仅应该有实用的功能,还要有一个漂亮的外观,这样才能使应用程序更加友善,更加吸引用户.作为一个跨平台的UI开发框架,Qt提供了强大而灵活的界面外观设计机制. Qt样式表是一个可以自定义部件外观的十分强大的机制.Qt样式表的概念.术语和语法都受到了HTML的层叠样式表(Cascading S

[Qt教程] 第43篇 进阶(三)对象树与拥有权

[Qt教程] 第43篇 进阶(三)对象树与拥有权 楼主  发表于 2013-9-12 16:39:33 | 查看: 255| 回复: 1 对象树与拥有权 版权声明 该文章原创于Qter开源社区 导语 学习完前面的内容,大家对应用Qt编程应该已经有了一个大概的印象.后面的内容我们将介绍Qt中的一些核心机制,它们是构成Qt的基础,包括对象模型.信号和槽.对象树与拥有权等.在前面使用Qt编程时,大家对一些内容可能存在疑惑,学习完下面的知识,可以帮助大家更好的使用Qt进行编程. 环境:Windows X

[Qt教程] 第46篇 进阶(六) 国际化

[Qt教程] 第46篇 进阶(六) 国际化 楼主  发表于 2013-10-7 09:23:45 | 查看: 109| 回复: 0 国际化 版权声明 该文章原创于Qter开源社区 导语 在第2篇中讲述如何显示中文时,曾提到使用QTextCodec和tr()的方式直接显示中文,其实这只是一种临时的方法,方便我们快速完成程序,显示效果.当真正要发布一个程序时,最好的方式是在程序中使用英文字符串,而后使用国际化工具进行翻译. 国际化的英文表述为Internationalization,通常简写为I18

[Qt教程] 第48篇 进阶(八) 3D绘图简介

[Qt教程] 第48篇 进阶(八) 3D绘图简介 楼主  发表于 2013-10-7 09:44:37 | 查看: 184| 回复: 0 3D绘图简介 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 OpenGL是一个跨平台的用来渲染3D图形的标准API.在Qt中提供了QtOpenGL模块,从而很轻松地实现了在Qt应用程序中使用OpenGL,这主要是在QGLWidget类中完成的.因为3D绘图涉及到了专业方面的内容,我们下面只是讲解最简单的使用,向大家演示在Qt中如何显示

[Qt教程] 第44篇 进阶(四)信号和槽

[Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容中已经多次用到过信号和槽了,这一节我们将详细讲解信号和槽的机制和使用方式.大家可以在帮助中查看Signals& Slots关键字. 环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目录 一.信号和槽机制 二.信号和槽的自动关联 三.信号和槽的高级应用 正文 一.信号和

[Qt教程] 第49篇 进阶(九) 多媒体应用简介

[Qt教程] 第49篇 进阶(九) 多媒体应用简介 楼主  发表于 2013-10-7 09:50:36 | 查看: 267| 回复: 2 多媒体应用简介 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语      Qt对于音频视频的播放和控制等多媒体应用提供了强大的支持.要想使计算机发出响声,最简单的方法是调用QApplication::beep()静态函数:而对于简单的声音播放,可以使用 QSound类:对于简单的动画播放,可以使用QMovie类:要想对音频视频实现更多

[Qt教程] 第17篇 2D绘图(七)涂鸦板

[Qt教程] 第17篇 2D绘图(七)涂鸦板 楼主  发表于 2013-5-2 21:37:41 | 查看: 1255| 回复: 16 涂鸦板 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语        通过前面几节的学习,大家应该已经对Qt中2D绘图有了一定的认识,这一节我们将应用前面讲到的内容,编写一个简单的涂鸦板程序,这一节只是实现最基本的鼠标画线功能. 环境:Windows Xp + Qt 4.8.4+QtCreat

[Qt教程] 第37篇 网络(七)TCP(一)

[Qt教程] 第37篇 网络(七)TCP(一) 楼主  发表于 2013-9-6 15:44:45 | 查看: 398| 回复: 1 TCP (一) 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 TCP即TransmissionControl Protocol,传输控制协议.与UDP不同,它是面向连接和数据流的可靠传输协议.也就是说,它能使一台计算机上的数据无差错的发往网络上的其他计算机,所以当要传输大量数据时,我们选用TCP协议.         TCP协议的程序使用

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动,检测它们的碰撞和叠加:或者我们想让自己绘制的图形可以拖动位置,进行缩放和旋转等操作.实现这些功能,要是还使用以前的方法,那么会十分困难.解决这些问题,可以使用Qt提供的图形视图框架.