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);
}
參考: