1. 程式人生 > >Qt學習——利用Qt Assistant 定製幫助文件

Qt學習——利用Qt Assistant 定製幫助文件

環境:windows10+Qt 5.10.1

一、概述

Qt可以通過Qt Assistant為自己的應用程式編制幫助文件,檔案目錄架構如下:

helpdocument │  about.txt //說明 │  assistant.exe  │  help.qch // .qhp生成 │  help.qhc //  .qhcp生成 │  help.qhcp// 幫助文件視窗介面描述 │  help.qhp // 幫助文件描述 │ ├─htmlDocument //幫助文件,請注意html文件格式 │      about.html │      error.html │      function.html │      index.html │ └─imageDocument //文件圖片         icon.jpg         robot.png

二、建立.qhp檔案並生成.qch檔案

1、檔案建立

qhp檔案

Qt Help Project的縮寫,qhp型別檔案是XML格式的,負責組織實際用到的幫助檔案(通常為HTML檔案,即需要在Qt Assistant中瀏覽的檔案)。

qch檔案

Qt Compressed Help的縮寫,qch型別檔案是二進位制格式的,qch檔案是Qt Assistant能夠識別的文件最小單元,可以通過Qt Assistant->編輯->首選項->文件標籤頁->新增/移除操作來註冊或者登出一個qch檔案。也可以通過命令“assistant -register doc.qch”來註冊qch檔案。註冊後,即可在Assistant介面中瀏覽幫助文件。

建立help.qhp檔案並編寫其內容如下

<?xml version="1.0" encoding="GB2312"?>
<QtHelpProject version="1.0">
  <namespace>software.help</namespace>
  <virtualFolder>doc</virtualFolder>
  <filterSection>
    <toc>
        <section title="首頁" ref="htmlDocument/index.html">
			<section title="功能" ref="htmlDocument/function.html"></section>
            <section title="錯誤" ref="htmlDocument/error.html"></section>
            <section title="關於" ref="htmlDocument/about.html"></section>
        </section>
    </toc>
    <keywords>
        <keyword name = "功能" ref="htmlDocument/function.html"></keyword>
        <keyword name = "錯誤" ref="htmlDocument/error.html"></keyword>
    </keywords>
    <files>
      <file>htmlDocument/*.html</file>
      <file>imageDocument/*.jpg</file>
	  <file>imageDocument/*.png</file>
    </files>
  </filterSection>
</QtHelpProject>

提示:注意html檔案路徑及儲存編碼,否則會出現無法找到檔案或者顯示亂碼的問題,修改html檔案後需重新生成qhp檔案才會更新。

生成qhp檔案 

qhelpgenerator help.qhp -o help.qch

2、測試(不是必需用於驗證)

註冊

assistant -register help.qch

顯示

assistant

三、建立.qhcp檔案並生成.qhc檔案

1、檔案建立

qhcp檔案

Qt Help Collection Project的縮寫,該檔案是XML格式的,其主要作用是將qch二進位制檔案組織成為一個collection,定製客戶化的Assistant。

qhc檔案

由qhcp檔案通過qcollectiongenerator命令生成的二進位制檔案,用於啟動Assistant時獲取指定collection引數。qhc檔案中包含qch檔案的集合,開啟Assistant時,通過指定當前collection即可註冊多個幫助文件。

建立help.qhcp檔案並編寫其內容如下

<?xml version="1.0" encoding="GB2312"?>
<QHelpCollectionProject version="1.0">
<assistant>
  <title>幫助文件</title>
  <applicationIcon>imageDocument/robot.png</applicationIcon>
  <cacheDirectory>cache/help</cacheDirectory>
  <homePage>qthelp://software.help/doc/htmlDocument/index.html</homePage>
  <startPage>qthelp://software.help/doc/htmlDocument/index.html</startPage>
  <aboutMenuText>
    <text>關於</text>
  </aboutMenuText>
  <aboutDialog>
    <file>about.txt</file>
    <icon>imageDocument/robot.png</icon>
  </aboutDialog>
  <enableDocumentationManager>false</enableDocumentationManager>
  <enableAddressBar>false</enableAddressBar>
  <enableFilterFunctionality>false</enableFilterFunctionality>
</assistant>
<docFiles>
  <generate>
    <file>
      <input>help.qhp</input>
      <output>help.qch</output>
    </file>
  </generate>
  <register>
    <file>help.qch</file>
  </register>
</docFiles>
</QHelpCollectionProject>

提示:注意html檔案路徑及儲存編碼,否則會出現無法找到檔案或者顯示亂碼的問題,修改html檔案後需重新生成qhc檔案才會更新。

生成qhc檔案 

qcollectiongenerator help.qhcp -o help.qhc

2、測試(不是必需用於驗證)

註冊

assistant -collectionFile help.qhc

顯示

assistant

四、整合到程式中

建立C++ class類,命名為assistant。這裡用到QProcess類,它是一個用來啟動外部程式並與之通訊的Qt類。

assistant.h檔案

#ifndef ASSISTANT_H
#define ASSISTANT_H

#include <QtCore/QString>

class QProcess;
class assistant
{
public:
    assistant();
    ~assistant();
    void showDocumentation(const QString &file);
    bool startAssistant();

private:
    QProcess *proc;
};

#endif // ASSISTANT_H

assistant.cpp檔案

#include "assistant.h"
#include <QtCore/QByteArray>
#include <QtCore/QProcess>
#include <QtWidgets/QMessageBox>

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://software.help/doc/htmlDocument/");
   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("../software/helpdocument/assistant.exe");
       QStringList args;
       args << QLatin1String("-collectionFile")
            << QLatin1String("../software/helpdocument/help.qhc");
       proc->start(app, args); // 相當於執行命令:assistant –collectionFile myHelp.qhc
       if (!proc->waitForStarted())
       {
            QMessageBox::critical(0, QObject::tr("help"),
                QObject::tr("Unable to launch Qt Assistant (%1)").arg(app));
            return false;
       }
   }
   return true;
}

開啟幫助文件

assistant *pAssistant;

void MainWindow::on_helpButton_clicked()
{
    //建立幫助文件
    pAssistant = new assistant;
    if(pAssistant->startAssistant())
        pAssistant->showDocumentation("index.html");
    else
        QMessageBox::warning(this, tr("警告"), tr("無法開啟幫助文件"), QMessageBox::Abort);

}

參考: