zoukankan      html  css  js  c++  java
  • VS-Qt环境下dll

    首先,不得不承认的是,Qt中的数据类型使用很方便,当我们的主框架是基于Qt的时候也就没必要刻意追求辅助函数所在的dll是Win32的(如果原功能函数就是只使用标准库及基础类型,那也可以在Qt框架中调用,这不是本篇的重点)。我们之所以要使用QtLibrary是不考虑整合旧代码的情况下方便我们编写Qt程序的时候实现界面与功能的分离。

    1.创建库

    1)创建QtLibrary项目,并进行相关设置。

    2)根据需要在图2张选择dll需要的库;

    3)输入ClassName,注意,下面两个选项不要勾选,除非想生成静态库的情况下需要勾选第二个。

    接下来需要对代码进行改造。

    4)正常情况下,会生成三个文件,分别为:DLLTest.h、DLLTest.cpp以及DLLTest_global.h

    前两个文件自不必说,主要是第三个文件,大致是这样:

     1 #ifndef DLLTEST_GLOBAL_H
     2 #define DLLTEST_GLOBAL_H
     3 
     4 #include <QtCore/qglobal.h>
     5 
     6 #ifdef DLLTEST_LIB
     7 # define DLLTEST_EXPORT Q_DECL_EXPORT
     8 #else
     9 # define DLLTEST_EXPORT Q_DECL_IMPORT
    10 #endif
    11 
    12 #endif // DLLTEST_GLOBAL_H

    发现这个头文件中其实并没有起到实际作用的代码,无非是一些宏定义(# define DLLTEST_EXPORT Q_DECL_EXPORT 和 # define DLLTEST_EXPORT Q_DECL_IMPORT),这段代码在Win32下也经常见到,所以为了减轻调用时的负担,选择移除它,当然需要对DLLTest.h进行一些小改动,将这段代码写进来,或者,直接舍弃这段代码。

    5)将代码直接拷贝到DLLTest.h(当然不包括前三行)中的方法很简单,着重说一下第二种。

    因为通过观察Q_DECL_EXPORT本身就是一个宏定义,它的“庐山真面目”就是“_declspec(dllexport)”所以我们将头文件改造成:

     1 #ifndef DLLTEST_H
     2 #define DLLTEST_H
     3 
     4 //#include "dlltest_global.h"
     5 //#include <QtCore/qglobal.h>
     6 #include <QString>
     7 #include <QDateTime>
     8 
     9 class _declspec(dllexport) dllTest
    10 {
    11 public:
    12     dllTest();
    13     ~dllTest();
    14 
    15     void setStr(const QString& str);    //成员函数,传入QString变量
    16     QString getStr();    //成员函数,返回改造后的QString变量
    17 
    18 private:
    19     QString m_str;    //成员变量
    20 };
    21 
    22 #endif // DLLTEST_H
    DLLTest.h

    注意:由于头文件中没有include任何头文件,所以无论我们需要使用任何类型都要手动包含,至于是否写在头文件中视情况而定。

    6)紧接着我们实现成员函数:

     1 #include "dlltest.h"
     2 
     3 dllTest::dllTest()
     4 {
     5 
     6 }
     7 
     8 dllTest::~dllTest()
     9 {
    10 
    11 }
    12 
    13 void dllTest::setStr(const QString& str)
    14 {
    15     m_str=str+"--------"+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    16 }
    17 QString dllTest::getStr()
    18 {
    19     return m_str;
    20 }
    DLLTest.cpp

    7)OK,dll部分结束。

    2.dll的调用部分:

    按照正常的调用流程:1)链接器->输入lib;2)附加包含目录(直接将DLLTest.h包含即可);3)调用即可。

    测试部分代码:

     1 #ifndef MAINTEST_H
     2 #define MAINTEST_H
     3 
     4 #include <QtWidgets/QMainWindow>
     5 #include "ui_maintest.h"
     6 
     7 class mainTest : public QMainWindow
     8 {
     9     Q_OBJECT
    10 
    11 public:
    12     mainTest(QWidget *parent = 0);
    13     ~mainTest();
    14 
    15 private:
    16     Ui::mainTestClass ui;
    17 
    18 private slots:
    19     void GoClick();
    20 };
    21 
    22 #endif // MAINTEST_H
    mainTest.h
     1 #include "maintest.h"
     2 #include "dlltest.h"
     3 
     4 mainTest::mainTest(QWidget *parent)
     5     : QMainWindow(parent)
     6 {
     7     ui.setupUi(this);
     8 
     9     connect(ui.btnGo,SIGNAL(clicked()),this,SLOT(GoClick()));
    10 }
    11 
    12 mainTest::~mainTest()
    13 {
    14 
    15 }
    16 
    17 void mainTest::GoClick()
    18 {
    19     dllTest dt;
    20     dt.setStr(ui.txtIn->toPlainText());
    21 
    22     ui.txtOut->setText(dt.getStr());
    23 }
    mainTest.cpp

    效果图:

    -----The End

  • 相关阅读:
    vue 兼容ie 下载文件
    IDEA maven项目添加自己的jar包依赖
    mongodb 用户权限操作
    springboot + aspect
    Enum枚举类
    线上CPU飙升100%问题排查
    Linux零拷贝技术
    Java线程池实现原理及其在美团业务中的实践
    深入解析String#intern
    Java对象内存布局
  • 原文地址:https://www.cnblogs.com/gisk/p/5361727.html
Copyright © 2011-2022 走看看