• Qt 创建包含多个项目的工程以及各项目之间的调用


    在用QT做一个包含许多个小项目的大项目时,遇到了无法把多个项目合并到一个Pro的问题,后来经过艰苦尝试,终于可以在一个大项目下包含许多小项目了。但同时各个项目之间的调用又出现了问题,目前已解决。下面就把我的经验分享给大家。

    一、创建包含多个小项目的大项目
    1、第一种情况:在新建的empty project 下创建新的子项目
    2、第二种情况:在新建的empty project 下添加已存在的项目
    3、第三种情况:在已经编好的项目下创建新的子项目
    4、第四种情况:在已经编好的项目下添加已存在的项目
    1、在新建的empty project 下创建新的子项目。可以分为以下几步:
    (1)文件 → 新建文件和项目 → 其他项目 → empty qmake project
    (2)填写工程名、创建路径等信息。创建完成后如下图所示。(我创建的大项目叫untitled)

     (3)打开生成的Pro文件 → 手动输入TEMPLATE = subdirs

     (4)右键工程文件夹 → 新子项目 → 选择你想创建的项目

    (这里我创建一个widget,子项目名字叫untitled1)
    创建完成后如下图所示

    2、在新建的empty project 下添加已存在的项目,步骤如下
    (1)这里我们继续在1已经建好的empty project下添加,创建empty project的步骤和1一样。
    (2)将你要添加的子项目的文件夹移到创建的大项目文件夹下,和大项目的Pro文件存储在一起。如下如所示(SignalAndSlot是我要添加的子项目):

     (2)右键工程文件夹 → add existing projects(QT版本5.14之前的版本好像没有这个选项,这个我也没有办法)→ 在弹出的窗口中选择你要添加的项目的Pro文件(我选中的是SignalAndSlot.Pro)
    添加好之后如下图所示:

    至此,第一种和第二种情况就介绍完毕了,但是不管是新建的还是添加的子项目在运行时还是独立的。而且每一个子项目下都有一个main.cpp,但是程序的入口只能有一个,假设我现在要在新建的子项目untitled1中调用添加的子项目SignalAndSlot,那么就删除掉SignalAndSlot下的main.cpp。调用的步骤如下:
    (1)删除SignalAndSlot下的main.cpp
    (2)为SignalAndSlot创建SignalAndSlot_global.h头文件
    右键SignalAndSlot → addnew → c++ → c++ header file

     (3)在SignalAndSlot_global.h中输入以下代码,注意代码中的SIGNALANDSLOT要根据自己的项目名称做改变。

     1 #ifndef SIGNALANDSLOT_GLOBAL_H
     2 #define SIGNALANDSLOT_GLOBAL_H
     3 
     4 #include <QtCore/qglobal.h>
     5 
     6 #if defined(SIGNALANDSLOT_LIBRARY)
     7 #  define SIGNALANDSLOT_EXPORT Q_DECL_EXPORT
     8 #else
     9 #  define SIGNALANDSLOT_EXPORT Q_DECL_IMPORT
    10 #endif
    11 
    12 #endif // SIGNALANDSLOT_GLOBAL_H

    (4)在SignalAndSlot.Pro里面增加如下代码

    1 TARGET = SignalAndSlot
    2 TEMPLATE = lib
    3 DEFINES += SignalAndSlot_LIBRARY

    (5)右键untitled1 → 添加库 → 内部库 → 下一步 → 完成

     添加完成之后untitled1.Pro内会自动生成编译设置和路径代码,如下所示:

    1 win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../SignalAndSlot/release/ -lSignalAndSlot
    2 else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../SignalAndSlot/debug/ -lSignalAndSlot
    3 else:unix: LIBS += -L$$OUT_PWD/../SignalAndSlot/ -lSignalAndSlot
    4 
    5 INCLUDEPATH += $$PWD/../SignalAndSlot
    6 DEPENDPATH += $$PWD/../SignalAndSlot

    这样,untitled1就能调用SignalAnGSlot下的函数了。但是要注意只能调用SignalAnGSlot的Pbulic下面的函数。例如我要调用SignalAnGSlot下面的student类下面的函数。
    student.h如下所示(注意我调用的aaa函数在student.h中声明时前面加了static关键字,这是它能被调用的关键):

     1 #define STUDENT_H
     2 
     3 #include <QObject>
     4 
     5 class Student : public QObject
     6 {
     7     Q_OBJECT
     8 public:
     9 
    10     explicit Student(QObject *parent = nullptr);
    11 
    12     void  treat();
    13     void  treat(QString foodName);
    14     static void aaa();
    15 signals:
    16 
    17 //早期的Qt版本必须写到public slot 下,高级版本可以写到Public或者全局下
    18 //返回值是void,需要声明也需要实现
    19 //可以有参数,可以发生重载
    20 };
    21 
    22 #endif // STUDENT_H

    untitled1的main.cpp中这样写:

     1 #include "widget.h"
     2 #include "student.h"
     3 
     4 #include <QApplication>
     5 
     6 int main(int argc, char *argv[])
     7 {
     8     QApplication a(argc, argv);
     9     Widget w;
    10     w.show();
    11     Student::aaa();
    12     Student();
    13     return a.exec();
    14 }

    至于第三种第四种情况改天再写,今天不想写了,改天再写。如果你觉得有用的话给我点个赞吧,反正也不要钱。

     

  • 相关阅读:
    markdown语法---根据使用不断扩充中
    Linux命令(七)查找文件或目录 find
    Linux命令(六) 查看文件 cat tac more less tail
    Linux命令(五)创建文件或修改文件时间 touch
    Linux终端常用快捷键
    Linux命令(四)删除文件 rm
    实现免密码输入 ssh 登录
    jenkins 进阶系列网址
    shell与if相关参数
    安装tomcat过程中出现问题小结
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/16253999.html
Copyright © 2020-2023  润新知