天天看点

Qt中项目A调用另一个项目B的方法汇总

在开发一个软件项目时候,当涉及到一个模块,已经有过类似的项目开发,为了避免重复开发,涉及到在该项目的工程中调用已开发的项目作为子项目,有很多种方法。

一、将项目编译成库文件然后进行调用

调用库文件通常有两种调用方法,一种是内部调用,一种是外部调用。两者的区别不大,也就是

1.内部调用

用到TEMPLATE与SUBDIRS,只是这样就还需要一个大框架C来包含A和B,并不好用。

TEMPLATE = subdirs
SUBDIRS += \
    A \
    B 
           

2.外部调用

1) 方法1

项目A中调用项目B 的大致流程如下:

  1. 将项目B生成动态或者静态库,编译动态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译动态库,编译静态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译静态库;
  2. 将B的库文件和B所有的头文件一起放到项目A的工程目录下的同个目录中。(当然,也可以放到写入环境变量的目录下,只是个人感觉没必要);
  3. 通过外部库调用,引用库文件,使用"add Existing Directory"导入头文件。使用库文件的方法可以参考撮合Qt的mingw编译器与snmp++3.4.6之库文件使用。

1) 方法2

还有一种方法,可以用到Qt的宏定义,项目A中调用项目B 的大致流程如下:

  1. 在项目B的pro文件中修改,

    TEMPLATE = lib

    ,意我编译为库文件;
  2. 在B的pro文件中添加,

    DEFINES += TEXT_LIBRARY

    ,意为导出库文件,可参考Qt文档阅读笔记-共享库的创建与调用;
  3. 添加或者修改xxx_global.h文件,与第二步中的DEFINES内容对应起来,具体参考Qt文档阅读笔记-共享库的创建与调用;
  4. 修改B的类文件的内容,类名前加上第二步中DEFINES的内容,参考QT生成带界面的动态库并使用;

二、将项目编译成库文件然后进行调用

1.直接导入调用

项目A调用项目B,进行讲解。

直接将项目B的文件整个放入A中,然后通过"add Existing Directory",将B放入A中。只是这样的话,相当于将工程B的pro文件的内容,都写入A的pro文件中,这样A的工程文件会比较混乱,不利于使用。

2.使用pri文件调用

在项目B中创建一个pri文件,然后在A中调用B的pri文件,pri文件中的内容大致就是B的pro文件中的内容。这样使用起来会比较整齐。

例如B的pro文件的内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2019-01-22T17:29:55
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ADataAnsys
TEMPLATE = app

SOURCES +=\
        widget.cpp \
    paintarea.cpp \
    globaldata.cpp \
    playthread.cpp \
    dataansys.cpp

HEADERS  += widget.h \
    paintarea.h \
    globaldata.h \
    playthread.h \
    dataansys.h

FORMS    += widget.ui
           

则pri文件的内容可以这么写

SOURCES +=\
        $$PWD/widget.cpp \
    $$PWD/paintarea.cpp \
    $$PWD/globaldata.cpp \
    $$PWD/playthread.cpp \
    $$PWD/dataansys.cpp

HEADERS  += $$PWD/widget.h \
    $$PWD/paintarea.h \
    $$PWD/globaldata.h \
    $$PWD/playthread.h \
    $$PWD/dataansys.h \

FORMS    += $$PWD/widget.ui
           

因为这两行内容

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
           

在A的pro文件中有写,因此可以不写。

这两行内容

TARGET = ADataAnsys
TEMPLATE = app
           

因为B和A一起编译,因此不能写。都使用A的内容。

pri文件启示是pro文件的补充。可参考

三、结论

将项目编译成库文件然后进行调用,这样也有弊端,在跨平台时可能会比较麻烦,需要重新编译新的库。因此,笔者更喜欢用第二种方法,直接将要被调用的项目生成一个pri文件,放入调用的工程文件中,一起编译。

继续阅读