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

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

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

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

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

    

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

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

     https://blog.youkuaiyun.com/chenchong_88/article/details/43374761

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

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

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

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

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

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

有一个XXX_global.h文件

#pragma once

#include <QtCore/qglobal.h>

#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<QtWidgets\qwidget.h>
#include<QtWidgets\qpushbutton.h>
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<qglobal.h>
#include<QtWidgets\qlayout.h>
#include<QtWidgets\qboxlayout.h>
#include<QtWidgets\qmessagebox.h>
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所在的路径:

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


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

生成成功,然后调用

都没有问题。

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

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值