最近需要搞懂一个事情,就是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直接看源码,附一张图。
我们需要解决的是第一种,废话不多说。走起。
环境是VS2013+QT5.5,没什么好说的。
首先右键工程添加新项目,用QtClassLibray新建,名字随便
属性自动为dll动态库,如果不是dll就改成dll。你也可以根据需要添加一些QT的常用库,比如QTCore什么的,比如说笔者的如下图。然后你会看到QT自动生成了一些文件。
有一个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所在的路径:
然后要包含你生成的这个lib所在的路径。对于笔者而言,位置如上图所示。没有什么不好懂的。然后就可以在你的事件中调用了。代码这样就行:
QtClassLibraryTest*hehe = new QtClassLibraryTest();
hehe->show();
生成成功,然后调用
都没有问题。
有任何问题可以直接联系本人QQ:498771026。欢迎大家讨论