关于QT动态库,利用动态库导入界面(实例)

    最近需要搞懂一个事情,就是QT如何用使用动态库。我们需要解决以下几个问题:

1.有时候我们不希望在当前工程下设计界面,而是希望把界面做成一个动态链接库,然后主程序调用这个动态链接库,然后主程序把这个动态库中包含的界面show出来。

2.我们希望进行插件式开发,也就是说,把你设计好的界面放到Designer中,然后从Designer拖放到ui中。这种方式生成的插件只能在QtDesigner中使用,却不能在Qt Creator中使用,因为现在使用的Windows版本的QtCreator是使用VS的编译器生成的,而QtCreator 中编译项目使用的是MinGW/g++编译器。这一点我们可以不用管。

3.我们希望写一个方法,做成插件,然后在主程序中调用,这个插件继承自QObject。

    

    这三种问题,笔者作为一只小白,都已经解决了。下面的教程有不懂的,也可以当面联系我QQ 498771026,随时欢迎大家

    对于第一种,笔者自己研究了一下,一会放具体的教程上来。也可以参考博客:

     https://blog.csdn.net/chenchong_88/article/details/43374761

    对于第二种,大家请移驾:https://blog.csdn.net/lhl1124281072/article/details/80039223

    对于第三种,在QT的官方例子中已经有了,大家可以打开QtCretor直接看源码,附一张图。

关于QT动态库,利用动态库导入界面(实例)_第1张图片

我们需要解决的是第一种,废话不多说。走起。

环境是VS2013+QT5.5,没什么好说的。

首先右键工程添加新项目,用QtClassLibray新建,名字随便

关于QT动态库,利用动态库导入界面(实例)_第2张图片

属性自动为dll动态库,如果不是dll就改成dll。你也可以根据需要添加一些QT的常用库,比如QTCore什么的,比如说笔者的如下图。然后你会看到QT自动生成了一些文件。

关于QT动态库,利用动态库导入界面(实例)_第3张图片关于QT动态库,利用动态库导入界面(实例)_第4张图片

有一个XXX_global.h文件

#pragma once

#include 

#ifndef BUILD_STATIC
# if defined(QTCLASSLIBRARYTEST_LIB)
#  define QTCLASSLIBRARYTEST_EXPORT Q_DECL_EXPORT
# else
#  define QTCLASSLIBRARYTEST_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTCLASSLIBRARYTEST_EXPORT
#endif

这就是像普通的动态库一样,定义了一些输出的宏。这个Q_DECL_EXPORT宏你也会在工程属性里的与处理器定义里面找到。自动生成的文件还有一个h文件,一个CPP文件,这两个文件就是你需要输出的自定义的Widget了,也就是说我们只需要修改它们就行了。首先是h文件:

#pragma once

#include "qtclasslibrarytest_global.h"
#include
#include
class QTCLASSLIBRARYTEST_EXPORT QtClassLibraryTest : public QWidget
{
	Q_OBJECT

public:
	explicit QtClassLibraryTest(QWidget * parent = 0);
	~QtClassLibraryTest();

	private slots:
	void onBtnClick();

private:
	QPushButton *m_btn;
};

然后是相应的CPP:

#include "QtClassLibraryTest.h"
#include
#include
#include
#include
QtClassLibraryTest::QtClassLibraryTest(QWidget * parent)
:QWidget(parent)
{
	this->resize(200, 200);
	QVBoxLayout*lay = new QVBoxLayout();
	
	m_btn = new QPushButton();
	QObject::connect(m_btn, SIGNAL(clicked()), this, SLOT(onBtnClick()));
	lay->addWidget(m_btn);
	this->setLayout(lay);
}

QtClassLibraryTest::~QtClassLibraryTest()
{

}

void QtClassLibraryTest::onBtnClick()
{
	QMessageBox*hehe = new QMessageBox(QMessageBox::Icon::Information, QString("hehe"), QString("ninja"));
	hehe->show();
}

很简单的一波操作,然后生成,应该是成功的。生成了三个文件,exp、lib、dll。下面就要在主程序中用了。

新建一个主程序,MainWindow什么的都好,然后可以自己写一个事件来调用。

那么我么需要做一些预处理工作,首先是在主程序中包含头文件,也就是你的QtClassLibraryTest.h所在的路径:

关于QT动态库,利用动态库导入界面(实例)_第5张图片关于QT动态库,利用动态库导入界面(实例)_第6张图片

关于QT动态库,利用动态库导入界面(实例)_第7张图片

然后要包含你生成的这个lib所在的路径。对于笔者而言,位置如上图所示。没有什么不好懂的。然后就可以在你的事件中调用了。代码这样就行:


	QtClassLibraryTest*hehe = new QtClassLibraryTest();
	hehe->show();

生成成功,然后调用

关于QT动态库,利用动态库导入界面(实例)_第8张图片

都没有问题。

有任何问题可以直接联系本人QQ:498771026。欢迎大家讨论

 

你可能感兴趣的:(关于QT动态库,利用动态库导入界面(实例))