我们封装dll是程序更灵活,但是.h文件暴露了我的成员变量,所以我们在进行封装保护我们的成员变量外漏。
1.修改.h 文件
/*
* @2012-10-9
*/
#ifndef HELP_H
#define HELP_H
#include <QtCore/QString>
#include "help_global.h"
class QProcess;
class HELPSHARED_EXPORT Help
{
public:
Help();
~Help();
void showDocumentation(const QString &file);
private:
class helpPrivate *p;
};
#endif // HELP_H
2.修改 .cpp文件
/*
* @2012-10-9
* 帮助文档核心调用assistant.exe
*/
#include <QtCore/QByteArray>
#include <QtCore/QDir>
#include <QtCore/QProcess>
#include <QtGui/QMessageBox>
#include "help.h"
class helpPrivate
{
public:
helpPrivate(){
m_proc = 0;
}
~helpPrivate(){
delete m_proc;
}
bool startHelp();
public:
QProcess *m_proc;
};
Help::Help()
{
p = new helpPrivate();
}
Help::~Help()
{
if (p->m_proc && p->m_proc->state() == QProcess::Running) {
p->m_proc->terminate();
p->m_proc->waitForFinished(3000);
}
delete p;
}
void Help::showDocumentation(const QString &page)
{
if (!p->startHelp())
return;
//首页显示
QByteArray ba("SetSource ");
ba.append("qthelp://com.PeralGlobal.RobotWorkbench.help/doc/");
p->m_proc->write(ba + page.toLocal8Bit() + '\n');
}
bool helpPrivate::startHelp()
{
if (!m_proc)
m_proc = new QProcess();
if (m_proc->state() != QProcess::Running){
QDir dir;
//获取assistant.exe的路径
QString app = dir.currentPath() + QDir::separator();
app += QLatin1String("assistant.exe");
//执行命令
QStringList args;
args << QLatin1String("-collectionFile")
<< dir.currentPath()
+ QLatin1String("/documentation/help.qhc")
<< QLatin1String("-enableRemoteControl");
//执行进程
m_proc->start(app, args);
if (!m_proc->waitForStarted()){
QMessageBox::critical(0, QObject::tr("RobotWorkbench Help"),
QObject::tr("Unable to launch Robot Workbench Assistant (%1)").arg(app));
return false;
}
}
return true;
}