Qt创建和使用带界面的动态库教程

Qt版本:
Qt创建和使用带界面的动态库教程_第1张图片


创建动态库
文件,新建文件或项目。选择c++库
Qt创建和使用带界面的动态库教程_第2张图片
起名为QTLib
Qt创建和使用带界面的动态库教程_第3张图片
Qt创建和使用带界面的动态库教程_第4张图片
勾选QtGui
Qt创建和使用带界面的动态库教程_第5张图片
设置类名,点下一步,完成
Qt创建和使用带界面的动态库教程_第6张图片
项目创建完成后,新建一个界面文件。
文件,新建文件或项目。选择Qt 设计师界面
Qt创建和使用带界面的动态库教程_第7张图片
选择mainwindow
Qt创建和使用带界面的动态库教程_第8张图片
ui文件名字
Qt创建和使用带界面的动态库教程_第9张图片
点击完成
Qt创建和使用带界面的动态库教程_第10张图片
之后编辑创建的ui文件,简单的添加一个按钮
Qt创建和使用带界面的动态库教程_第11张图片
项目目录结构
Qt创建和使用带界面的动态库教程_第12张图片
打开qtlib.h
查看QTLib类的定义,有一个QTLIBSHARED_EXPORT宏

class QTLIBSHARED_EXPORT QTLib:public QMainWindow
{
public:
    QTLib();
};

并在qtlib.h中包含了一个头文件

#include "QTLib_global.h"

查看QTLib_global.h

#ifndef QTLIB_GLOBAL_H
#define QTLIB_GLOBAL_H

#include 

#if defined(QTLIB_LIBRARY)
#  define QTLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define QTLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // QTLIB_GLOBAL_H

若定义QTLIB_LIBRARY,则QTLIBSHARED_EXPORT被替换为Q_DECL_EXPORT,而没有则被替换为Q_DECL_IMPORT
在项目文件QTLib.pro中,有这样一句

DEFINES += QTLIB_LIBRARY

因此Qt库项目中,QTLIBSHARED_EXPORT被替换为Q_DECL_EXPORT,对类进行导出
而使用Qt库的项目中,QTLIBSHARED_EXPORT会被替换为Q_DECL_IMPORT

下面生成ui_xxx.h
在项目文件中加入

QT+= widgets

并执行qmake
之后点击编译,会弹出以下对话框,因为生成的是库文件,无法直接运行,因此关闭即可
Qt创建和使用带界面的动态库教程_第13张图片
在编译文件夹下产生了ui头文件ui_mainwindow.h
Qt创建和使用带界面的动态库教程_第14张图片
在qtlib.h包含ui头文件

#include "ui_mainwindow.h"

在界面编辑器中,找到ui对象的名称
Qt创建和使用带界面的动态库教程_第15张图片
在qtlib.h中创建一个命名域UI,并且在其中加入ui类的前向声明

namespace Ui {
class MainWindow;
}

在QTLib类中创建一个ui类指针

 Ui::MainWindow *ui;

并在构造函数的成员初始化列表中创建ui类,在构造函数中调用setupUi方法

QTLib::QTLib():ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

再次编译。在编译目录下的debug文件夹下面会成功生成库文件,其中QTLib.dll是我们需要的动态库
Qt创建和使用带界面的动态库教程_第16张图片


测试:
新建一个项目,简单的一个Qt控制台应用,使用它来测试我们生成的动态库
Qt创建和使用带界面的动态库教程_第17张图片
项目名字
Qt创建和使用带界面的动态库教程_第18张图片
Qt创建和使用带界面的动态库教程_第19张图片
项目创建完成后,将QTLib源代码文件夹下的qtlib.h、QTLib_global.h以及编译目录下生成的ui_mainwindow.h都拷贝到TestLib源代码文件夹下
Qt创建和使用带界面的动态库教程_第20张图片
在TestLib项目文件中加入

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

在main.cpp包含qtlib.h,创建QTLib类并使用
main.cpp

#include 
#include "qtlib.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTLib ql;
    ql.show();
    return a.exec();
}

由于编译与运行时需要使用到动态库,在项目文件中加入

LIBS += -LC:\Qt\projects\QTLib-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug\debug -lQTLib

-L后面跟链接的库目录,即QTLib生成的QTLib.dll所在的目录
-l后面跟的链接的库名称,链接动态库QTLib.dll
对于每次修改项目文件后,都需要执行一次qmake
之后编译运行得到QTLib的界面。
Qt创建和使用带界面的动态库教程_第21张图片
注意:
由于我使用的是基于MinGW的qt版本,对于g++,动态库只会生成dll文件,不会生成对应的lib文件,使用时只需要在项目文件中使用命令链接对应的dll文件即可。
而对于基于MSVC的qt,生成动态库同时会生成lib文件,在使用时只需要对项目右键,添加库,外部库,选择相应的lib文件与路径就可以了
Qt创建和使用带界面的动态库教程_第22张图片


源代码:

QTLib:
QTLib.pro

#-------------------------------------------------
#
# Project created by QtCreator 2022-05-27T14:05:55
#
#-------------------------------------------------
QT+= widgets
TARGET = QTLib
TEMPLATE = lib

DEFINES += QTLIB_LIBRARY

SOURCES += qtlib.cpp

HEADERS += qtlib.h\
        QTLib_global.h

unix:!symbian {
    maemo5 {
        target.path = /opt/usr/lib
    } else {
        target.path = /usr/lib
    }
    INSTALLS += target
}

FORMS += \
    mainwindow.ui

qtlib.h

#ifndef QTLIB_H
#define QTLIB_H

#include "QTLib_global.h"
#include "ui_mainwindow.h"

namespace Ui {
class MainWindow;
}

class QTLIBSHARED_EXPORT QTLib:public QMainWindow
{
public:
    QTLib();
private:
     Ui::MainWindow *ui;
};

#endif // QTLIB_H

QTLib_global.h

#ifndef QTLIB_GLOBAL_H
#define QTLIB_GLOBAL_H

#include 

#if defined(QTLIB_LIBRARY)
#  define QTLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define QTLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // QTLIB_GLOBAL_H

qtlib.cpp

#include "qtlib.h"


QTLib::QTLib():ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

mainwindow.ui



 MainWindow
 
  
   
    0
    0
    379
    328
   
  
  
   MainWindow
  
  
   
    
     
      130
      110
      75
      23
     
    
    
     PushButton
    
   
  
  
   
    
     0
     0
     379
     23
    
   
  
  
 
 
 


TestLib:
TestLib.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2022-05-27T14:18:57
#
#-------------------------------------------------

QT       += core

QT       -= gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = TestLib
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

LIBS += -LC:\Qt\projects\QTLib-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug\debug -lQTLib

main.cpp

#include 
#include "qtlib.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTLib ql;
    ql.show();
    return a.exec();
}

你可能感兴趣的