软件打包安装工具第三篇(安装程序源码)


安装程序分了6个模块,其中模块PackageCore是安装程序的核心,因为其他5个模块都是依赖这个核心模块。有的同学可能会好奇为啥每个界面都单独放到一个模块里面,而且代码只有一点点,为什么要分5个模块。这个是因为每个界面都相互独立,互不影响,而且为了以后更好的进行扩展,比如有的需要定制说不需要软件说明这个对话框,或者不需要软件启动界面等各种需求的时候,那么这种结构是最好的,因为我不加载这个模块就完事了。同时也是为了有定制需求的童鞋更好的拓展安装程序界面。

1、安装程序核心模块

1.1、注册PackageCore类

#include "packagecore.h"
#include "packagecorecmd.h"
#include "core/modulemacro.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackageCore)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

模块加载时,先进入attachDoxygen这个函数进行初始化。

1.2、初始化

#include "packagecorecmd.h"
#include "core/idoxresource.h"
#include "widget/imainwindow.h"
#include "manager/iappmanager.h"
#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

void releaseResource()
{
	Object<IAppManager> iAppManager(NIL);
	QString dir = iAppManager->applicationDir();
	QStringList params = iAppManager->property(DOXYGEN_PARAM).toStringList();
	if(params.isEmpty()) return; QString exePath = params.last(); Object<IDoxResource> iResource(NIL); 
	iResource->releaseResourceFile(exePath, QS("资源文件"), QS("许可文件"), dir + QS("\\config\\license.lic"));
	iResource->releaseResourceFile(exePath, QS("资源文件"), QS("安装文件"), dir + QS("\\config\\package.syp"));
	iResource->releaseResourceFile(exePath, QS("资源文件"), QS("动态背景"), dir + QS("\\config\\animation.gif"));
	iResource->releaseResourceFile(exePath, QS("资源文件"), QS("说明文件"), dir + QS("\\config\\information.inf"));
	iResource->releaseResourceFile(exePath, QS("资源文件"), QS("安装图片"), dir + QS("\\config\\startpicture.bmp"));
}

bool initApplication()
{
	Object<IMainWindow> iMainWindow(NIL);
	Object<IStackedWidget> iCore("Package.PackageCore");
	iMainWindow->setWidget(iCore);
	releaseResource(); return true;
}

END_DOX_NAMESPACE
Object<IStackedWidget> iCore("Package.PackageCore"); 这一句是创建PakcageCore对象实例,然后将它加入QMainWindow界面中。
releaseResource(); 这个函数是将引导程序中的资源释放到指定的文件夹中。比如许可文件,安装文件,安装软件时的动态背景,软件说明以及安装背景。

1.3、PackageCore类

PackageCore 头文件

#ifndef PACKAGECORE_H
#define PACKAGECORE_H

#include "widget/istackedwidget.h"
#include "QtWidgets/QStackedWidget"

BEGIN_DOX_NAMESPACE

class PackageCore
	: public QStackedWidget
	, public IStackedWidget
{
	REGISTER_ACTUALIZE(PackageCore, IStackedWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackageCore]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackageCore();

	/* @接口 默认构造函数
	 * @类名 [PackageCore]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackageCore();

	/* @接口
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月14日
	 */
	virtual int currentIndex();

	/* @接口
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual void nextWidgetPage();

	/* @接口
	 * @类名 [PackageCore]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual void frontWidgetPage();

	/* @接口
	 * @类名 []
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月25日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @参数
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月14日
	 */
	virtual void removeWidget(int);

	/* @接口
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月14日
	 */
	virtual void setCurrentIndex(int);

	/* @接口
	 * @类名 [PackageCore]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月25日
	 */
	virtual QString windowTitle() const;

	/* @接口
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月14日
	 */
	virtual void appendWidget(const Object<IWidget> &);

	/* @接口
	 * @类名 [IStackedWidget]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月14日
	 */
	virtual void removeWidget(const Object<IWidget> &);

private:

	/* @接口
	 * @类名 [PackageCore]
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月26日
	 */
	void initPackageCoreEvent();

private:

	QStringList m_titles;

};

END_DOX_NAMESPACE

#endif /*PACKAGECORE_H*/

PackageCore 源文件

#include "packagecore.h"
#include "QtCore/QTimer"
#include "widget/imainwindow.h"

BEGIN_DOX_NAMESPACE

PackageCore::PackageCore()
	: QStackedWidget(WIDGET_PARENT)
{
	initPackageCoreEvent();
}

PackageCore::~PackageCore()
{

}

int PackageCore::currentIndex()
{
	return QStackedWidget::currentIndex();
}

void PackageCore::nextWidgetPage()
{
	int count = QStackedWidget::count();
	int index = QStackedWidget::currentIndex();
	if(count == (index + 1)) return;
	QStackedWidget::setCurrentIndex(index + 1);
}

void PackageCore::frontWidgetPage()
{
	int index = QStackedWidget::currentIndex();
	if(index == 0) return;
	QStackedWidget::setCurrentIndex(index - 1);
}

ObjectPtr PackageCore::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

void PackageCore::initPackageCoreEvent()
{
	connect(this, &QStackedWidget::currentChanged, this, [=](int index)
	{
		Object<IMainWindow> iMainWindow(NIL);
		iMainWindow->windowTitle(m_titles[index]);
	});
}

QString PackageCore::windowTitle() const
{
	return QS("软件安装");
}

void PackageCore::removeWidget(int index)
{
	QStackedWidget::widgetRemoved(index);
}

void PackageCore::setCurrentIndex(int index)
{
	QStackedWidget::setCurrentIndex(index);
}

void PackageCore::appendWidget(const Object<IWidget> &iWidget)
{
	ObjectPtr ptr = iWidget->selfWidget();
	m_titles.append(iWidget->windowTitle());
	QWidget *pWidget = (QWidget *)ptr.value();
	QString title = iWidget->windowTitle();
	QStackedWidget::addWidget(pWidget);
}

void PackageCore::removeWidget(const Object<IWidget> &iWidget)
{
	ObjectPtr ptr = iWidget->selfWidget();
	QWidget *pWidget = (QWidget *)ptr.value();
	QStackedWidget::removeWidget(pWidget);
}

END_DOX_NAMESPACE

2、安装程序启动界面模块

2.1、注册PackagePict类

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/
#include "packagepict.h"
#include "packagepictcmd.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackagePict)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

2.2、模块初始化

#ifndef PACKAGEPICTCMD_H
#include "packagepictcmd.h"
#endif /*PACKAGEPICTCMD_H*/

#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

bool initApplication()
{
	Object<IWidget> iPath("Package.PackagePict");
	Object<IStackedWidget> iCore("Package.PackageCore");
	iCore->appendWidget(iPath); return true;
}

END_DOX_NAMESPACE

2.3、PackagePict类

PackagePict 头文件

#ifndef PACKAGEPICTURE_H
#define PACKAGEPICTURE_H

#include "widget/iwidget.h"
#include "QtWidgets/QWidget"

BEGIN_DOX_NAMESPACE

class PackagePict
	: public IWidget
	, public QWidget
{
	REGISTER_ACTUALIZE(PackagePict, IWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackagePicture]
	 * @作者 杨发荷PackagePicture
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackagePict();
	
	/* @接口 默认构造函数
	 * @类名 [PackagePicture]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackagePict();

	/* @接口
	 * @参数
	 * @类名 [PackagePicture]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	void paintEvent(QPaintEvent *);

	/* @接口
	 * @类名 [PackagePicture]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @类名 [PackagePicture]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual QString windowTitle() const;

private:

	/* @接口
	 * @类名 [PackagePict]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	void initPackagePict();

	/* @接口
	 * @类名 [PackagePict]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	void initPackagePictEvent();

private:

	QTimer *m_timer;

};

END_DOX_NAMESPACE

#endif /*PACKAGEPICTURE_H*/

PackagePict源文件

#include "packagepict.h"
#include "QtCore/QTimer"
#include "QtGui/QPainter"
#include "core/idoxfindfile.h"
#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

PackagePict::PackagePict()
	: QWidget(WIDGET_PARENT)
{
	initPackagePict();
	initPackagePictEvent();
}

PackagePict::~PackagePict()
{

}

ObjectPtr PackagePict::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

void PackagePict::initPackagePict()
{
	m_timer = new QTimer;
	m_timer->start(5000);
}

QString PackagePict::windowTitle() const
{
	return QS("软件安装");
}

void PackagePict::initPackagePictEvent()
{
	connect(m_timer, &QTimer::timeout, this, [=]()
	{
		Object<IStackedWidget> iCore("Package.PackageCore");
		iCore->nextWidgetPage(); m_timer->stop(); delete m_timer;
	});
}

void PackagePict::paintEvent(QPaintEvent *)
{
	Object<IDoxFindFile> iFindFile(NIL);
	QString file = iFindFile->findFile("startpicture.bmp");
	QImage image; image.load(file);
	QPixmap pixmap = QPixmap::fromImage(image);
	QPainter painter(this);
	painter.drawPixmap(QWidget::rect(), pixmap);
}

END_DOX_NAMESPACE

3、安装程序许可模块

3.1、注册PackageLice类

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/

#include "packagelice.h"
#include "packagelicecmd.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackageLice)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

3.2、模块初始化

#ifndef PACKAGELICECMD_H
#include "packagelicecmd.h"
#endif /*PACKAGELICECMD_H*/

#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

bool initApplication()
{
	Object<IWidget> iPath("Package.PackageLice");
	Object<IStackedWidget> iCore("Package.PackageCore");
	iCore->appendWidget(iPath); return true;
}

END_DOX_NAMESPACE

3.3、PackageLice类

PackageLice头文件

#ifndef PACKAGELICE_H
#define PACKAGELICE_H

#include "ui_packagelice.h"
#include "widget/iwidget.h"
#include "QtWidgets/QWidget"

BEGIN_DOX_NAMESPACE

class PackageLice
	: public IWidget
	, public QWidget
{
	REGISTER_ACTUALIZE(PackageLice, IWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackageLice]
	 * @作者 杨发荷PackageLice
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackageLice();

	/* @接口 默认构造函数
	 * @类名 [PackageLice]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackageLice();

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual QString windowTitle() const;

private:

	/* @接口
	 * @类名 [PackageLice]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	void initPackageLice();

	/* @接口
	 * @类名 [PackageLice]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	void initPackageLiceEvent();

private:

	Ui::PackageLice ui;

};

END_DOX_NAMESPACE

#endif /*PACKAGELICE_H*/

PackageLice源文件

#include "QtCore/QFile"
#include "packagelice.h"
#include "core/idoxfindfile.h"
#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

PackageLice::PackageLice()
	: QWidget(WIDGET_PARENT)
{
	ui.setupUi(this);
	initPackageLice();
	initPackageLiceEvent();
}

PackageLice::~PackageLice()
{
}

void PackageLice::initPackageLice()
{
	Object<IDoxFindFile> iFindFile(NIL);
	QString licfile = iFindFile->findFile("license.lic");
	if(licfile.isEmpty()) return; QFile file(licfile);
	if(!file.open(QIODevice::Text | QIODevice::ReadOnly)) return;
	QString text = QString::fromLocal8Bit(file.readAll());
	ui.LicenseText->setPlainText(text);
}

ObjectPtr PackageLice::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

void PackageLice::initPackageLiceEvent()
{
	connect(ui.NextPage, &QPushButton::clicked, this, [=]()
	{
		Object<IStackedWidget> iCore("Package.PackageCore");
		iCore->nextWidgetPage();
	});
	connect(ui.AllowRadio, &QRadioButton::clicked, this, [=]()
	{
		ui.NextPage->setEnabled(true);
	});
	connect(ui.UnallowRadio, &QRadioButton::clicked, this, [=]()
	{
		ui.NextPage->setEnabled(false);
	});
}

QString PackageLice::windowTitle() const
{
	return QS("软件许可");
}

END_DOX_NAMESPACE

4、安装程序软件说明模块

4.1、注册PackageInfo类

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/

#include "packageinfo.h"
#include "packageinfocmd.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackageInfo)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

4.2、模块初始化

#ifndef PACKAGEINFOCMD_H
#include "packageinfocmd.h"
#endif /*PACKAGEINFOCMD_H*/

#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

bool initApplication()
{
	Object<IWidget> iInfo("Package.PackageInfo");
	Object<IStackedWidget> iCore("Package.PackageCore");
	iCore->appendWidget(iInfo); return true;
}

END_DOX_NAMESPACE

4.3、PackageInfo类

PackageInfo头文件

#ifndef PACKAGEINFO_H
#define PACKAGEINFO_H

#include "widget/iwidget.h"
#include "ui_packageinfo.h"
#include "QtWidgets/QWidget"

BEGIN_DOX_NAMESPACE

class PackageInfo
	: public IWidget
	, public QWidget
{
	REGISTER_ACTUALIZE(PackageInfo, IWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackageInfo]
	 * @作者 杨发荷PackageInfo
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackageInfo();

	/* @接口 默认构造函数
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackageInfo();

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual QString windowTitle() const;

private:

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackageInfo();

	/* @接口
	 * @类名 [PackageInfo]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackageInfoEvent();

private:

	Ui::PackageInfo ui;

};

END_DOX_NAMESPACE

#endif /*PACKAGEINFO_H*/

PackageInfo源文件

#ifndef PACKAGEINFO_H
#include "packageinfo.h"
#endif /*PACKAGEINFO_H*/
#include "QtCore/QFile"
#include "core/idoxfindfile.h"
#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

PackageInfo::PackageInfo()
	: QWidget(WIDGET_PARENT)
{
	ui.setupUi(this);
	initPackageInfo();
	initPackageInfoEvent();
}

PackageInfo::~PackageInfo()
{

}

void PackageInfo::initPackageInfo()
{
	Object<IDoxFindFile> iFindFile(NIL);
	QString licfile = iFindFile->findFile("information.inf");
	if(licfile.isEmpty()) return; QFile file(licfile);
	if(!file.open(QIODevice::Text | QIODevice::ReadOnly)) return;
	QString text = QString::fromLocal8Bit(file.readAll());
	ui.InfoText->setPlainText(text);
}

ObjectPtr PackageInfo::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

void PackageInfo::initPackageInfoEvent()
{
	connect(ui.NextPage, &QPushButton::clicked, this, [=]()
	{
		Object<IStackedWidget> iCore("Package.PackageCore");
		iCore->nextWidgetPage();
	});
	connect(ui.FrontPage, &QPushButton::clicked, this, [=]()
	{
		Object<IStackedWidget> iCore("Package.PackageCore");
		iCore->frontWidgetPage();
	});
}

QString PackageInfo::windowTitle() const
{
	return QS("软件信息");
}

END_DOX_NAMESPACE

5、安装路径模块

5.1、注册PackagePath类

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/
#include "packagepath.h"
#include "packagepathcmd.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackagePath)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

5.2、模块初始化

#ifndef PACKAGEPATHCMD_H
#include "packagepathcmd.h"
#endif /*PACKAGEPATHCMD_H*/

#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

bool initApplication()
{
	Object<IWidget> iPath("Package.PackagePath");
	Object<IStackedWidget> iCore("Package.PackageCore");
	iCore->appendWidget(iPath); return true;
}

END_DOX_NAMESPACE

5.3、PackagePath类

PackagePath头文件

#ifndef PACKAGEROUTE_H
#define PACKAGEPATH_H

#include "widget/iwidget.h"
#include "ui_packagepath.h"
#include "QtWidgets/QWidget"

BEGIN_DOX_NAMESPACE

class PackagePath
	: public IWidget
	, public QWidget
{
	REGISTER_ACTUALIZE(PackagePath, IWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackageRoute]
	 * @作者 杨发荷PackageRoute
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackagePath();

	/* @接口 默认构造函数
	 * @类名 [PackageRoute]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackagePath();

	/* @接口
	 * @参数
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void paintEvent(QPaintEvent *);

	/* @接口
	 * @类名 [PackageRoute]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @类名 [PackageRoute]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual QString windowTitle() const;

private:

	/* @接口
	 * @类名 [PackagePath]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackagePath();

	/* @接口
	 * @类名 [PackagePath]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackagePathEvent();

private:

	QMovie *m_movie;
	Ui::PackagePath ui;

};

END_DOX_NAMESPACE

#endif /*PACKAGEPATH_H*/

PackagePath源文件

#ifndef PACKAGEPATH_H
#include "packagepath.h"
#endif /*PACKAGEPATH_H*/
#include "QtGui/QMovie"
#include "core/idoxfindfile.h"
#include "QtWidgets/QFileDialog"
#include "widget/istackedwidget.h"
#include "manager/iappmanager.h"

BEGIN_DOX_NAMESPACE

PackagePath::PackagePath()
	: QWidget(WIDGET_PARENT)
	, m_movie(new QMovie)
{
	ui.setupUi(this);
	initPackagePath();
	initPackagePathEvent();
}

PackagePath::~PackagePath()
{

}

void PackagePath::paintEvent(QPaintEvent *)
{
	if(ui.PathAnimation->isVisible())
		m_movie->start();
}

ObjectPtr PackagePath::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

void PackagePath::initPackagePath()
{
	Object<IDoxFindFile> iFindFile(NIL);
	ui.PathAnimation->setScaledContents(true);
	QString gif = iFindFile->findFile("animation.gif");
	if(gif.isEmpty()) ui.PathAnimation->setVisible(false);
	m_movie->setFileName(gif); ui.PathAnimation->setMovie(m_movie);
}

QString PackagePath::windowTitle() const
{
	return QS("安装路径");
}

void PackagePath::initPackagePathEvent()
{
	connect(ui.BeginPackage, &QPushButton::clicked, this, [=]()
	{
		QString packageFolder = ui.PackageFolder->text();
		QDir dir(packageFolder);  Object<IAppManager> iApp(NIL);
		if(!dir.exists()) dir.mkpath(packageFolder);
		Object<IStackedWidget> iCore("Package.PackageCore");
		iApp->property("PackagePath", ui.PackageFolder->text());
		iCore->nextWidgetPage();
	});
	connect(ui.FrontPage, &QPushButton::clicked, this, [=]()
	{
		Object<IStackedWidget> iCore("Package.PackageCore");
		iCore->frontWidgetPage();
	});
	connect(ui.SelectPath, &QPushButton::clicked, this, [=]()
	{
		QString dir = QFileDialog::getExistingDirectory(this, QS("请选择安装路径"),
			"", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
		dir.replace("/", "\\"); //单斜杠转换双斜杠,方便后续存储bin文件
		ui.PackageFolder->setText(dir); ui.BeginPackage->setEnabled(true);
	});
}

END_DOX_NAMESPACE

6、安装进度界面模块

6.1、注册PackageStat类

#ifndef MODULEMACRO_CORE_H
#include "core/modulemacro.h"
#endif /*MODULEMACRO_CORE_H*/
#include "packagestat.h"
#include "packagestatcmd.h"

BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("Package")
	XDEFINE_CLASSMAP_ENTRY_SINGLE(PackageStat)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE

OUTCAPI bool attachDoxygen()
{
	return dox::initApplication();
}

OUTCAPI bool detachDoxygen()
{
	return true;
}

6.2、模块初始化

#ifndef PACKAGESTATCMD_H
#include "packagestatcmd.h"
#endif /*PACKAGESTATCMD_H*/

#include "widget/istackedwidget.h"

BEGIN_DOX_NAMESPACE

bool initApplication()
{
	Object<IWidget> iStat("Package.PackageStat");
	Object<IStackedWidget> iCore("Package.PackageCore");
	iCore->appendWidget(iStat); return true;
}

END_DOX_NAMESPACE

6.3、PackageStat类

PackageStat头文件

#ifndef PACKAGESTAT_H
#define PACKAGESTAT_H

#include "widget/iwidget.h"
#include "ui_packagestat.h"
#include "QtWidgets/QWidget"

BEGIN_DOX_NAMESPACE

class PackageStat
	: public IWidget
	, public QWidget
{
	REGISTER_ACTUALIZE(PackageStat, IWidget)

public:

	/* @接口 默认构造函数
	 * @类名 [PackageStat]
	 * @作者 杨发荷PackageStat
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	PackageStat();

	/* @接口 默认构造函数
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年3月14号
	 */
	~PackageStat();

	/* @接口
	 * @参数
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月29日
	 */
	void showEvent(QShowEvent *);

	/* @接口
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual ObjectPtr selfWidget();

	/* @接口
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月27日
	 */
	virtual QString windowTitle() const;

private:

	/* @接口
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackageStat();

	/* @接口
	 * @类名 [PackageStat]
	 * @作者 杨发荷
	 * @邮箱 575814050@qq.com
	 * @时间 2020年11月28日
	 */
	void initPackageStatEvent();

private:

	bool m_bShow;
	QMovie *m_movie;
	Ui::PackageStat ui;

};

END_DOX_NAMESPACE

#endif /*PACKAGESTAT_H*/

PackageStat源文件

#include "packagestat.h"
#include "QtGui/QMovie"
#include "core/idoxcommand.h"
#include "core/idoxfindfile.h"
#include "core/idoxcompress.h"
#include "manager/iappmanager.h"

BEGIN_DOX_NAMESPACE

PackageStat::PackageStat()
	: QWidget(WIDGET_PARENT)
	, m_movie(new QMovie)
{
	m_bShow = false;
	ui.setupUi(this);
	initPackageStat();
	initPackageStatEvent();
}

PackageStat::~PackageStat()
{

}

void PackageStat::initPackageStat()
{
	Object<IDoxFindFile> iFindFile(NIL);
	ui.StatAnimation->setScaledContents(true);
	QString gif = iFindFile->findFile("animation.gif");
	if(gif.isEmpty()) ui.StatAnimation->setVisible(false);
	m_movie->setFileName(gif); ui.StatAnimation->setMovie(m_movie);
}

ObjectPtr PackageStat::selfWidget()
{
	return DOX_DYNAMIC_PTR(QWidget);
}

QString PackageStat::windowTitle() const
{
	return QS("安装进度");
}

void PackageStat::initPackageStatEvent()
{
	connect(ui.PackageFinish, &QPushButton::clicked, this, [=]()
	{
		Object<IDoxCommand> command(NIL);
		command->executeCommand("exitapp");
	});
}

void PackageStat::showEvent(QShowEvent *)
{
	if(!ui.StatAnimation->isVisible()) return;
	if(m_bShow) return; m_bShow = true; m_movie->start();
	Object<IAppManager> iApp(NIL); Object<IDoxCompress> iCom(NIL);
	QString packagePath = iApp->property("PackagePath").toString();
	QString package = iApp->applicationDir() + "\\config\\package.syp";
	iCom->beginUnCompress(package, packagePath);
}

END_DOX_NAMESPACE

7、最终安装程序界面

7.1、软件启动界面

在这里插入图片描述

7.2、软件许可界面

在这里插入图片描述

7.3、软件信息界面

在这里插入图片描述

7.4、安装路径界面

在这里插入图片描述

7.5、安装进度界面

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值