QT学习编写动态库

1.创建动态库

新建项目,选择库->C++类,类型选择共享库,勾选上QtGui,完成以后在.pro文件中加上DESTDIR = ..\MyDebug表示生成的内容放到这个文件夹中。DESTDIR = $$PWD/Output/ 表示安置工作目录在当前路径的Output文件夹中。没有这个文件夹会新建一个,$$PWD表示当前路径。项目中把Shadow build勾掉。.cpp中可以加上自己写的东西。

可以新添加一个窗体用来测试,选择QT->QT设计师界面类,选择Dialog,在dialog.h中包含_global.h头文件。

//也可以创建MainWindow 在头文件里要加上 TESTWIDGETSHARED_EXPORT宏
//可以理解成需要把这个类dialog导出,就是将其编译成一个dll文件之后其他的类可以使用这个导出类
class TESTWIDGETSHARED_EXPORT MyDialog : public QDialog
{
    Q_OBJECT
 
  
public:
    explicit MyDialog(QWidget *parent = 0);
    ~MyDialog();
 
  
private:
    Ui::MyDialog *ui;
};

在_global.h文件中

#include 
//此文件定义了两个宏 TESTWIDGETSHARED_EXPORT 如果定义了TESTWIDGET_LIBRARY,那么
//TESTWIDGETSHARED_EXPORT 定义为Q_DECL_EXPORT,否则定义为Q_DECL_IMPORT。这个名字是把对象导出的语句
//要编写窗口在创建文件的时候要勾选QtGui
#if defined(TESTWIDGET_LIBRARY)
#  define TESTWIDGETSHARED_EXPORT Q_DECL_EXPORT
#else
#  define TESTWIDGETSHARED_EXPORT Q_DECL_IMPORT
#endif

构建一下就在debug文件夹中生成了.a和.dll文件,.a是在Linux中使用,.dll是Windows中使用。

2.使用动态库

新建一个Qt WidgetsApplication项目,然后在.pro文件中同样加上DESTDIR = ..\MyDebug 以及在项目中勾掉Shadow build,另外加上INCLUDEPATH += ../sld 和LIBS += -L$$DESTDIR -lsld

 
  
QT       += core gui
 
  
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
  
DESTDIR = ..\MyDebug
 
  
TARGET = uselib
TEMPLATE = app
 
  
 
  
SOURCES += main.cpp\
        mainwindow.cpp
 
  
HEADERS  += mainwindow.h
 
  
FORMS    += mainwindow.ui
 
  
INCLUDEPATH += ../TestWidget
LIBS += ../MyDebug/TestWidget.dll
 
   
  

这两句话第一句是让我们这个项目可以找到动态库TestWidget.h和TestWidget_global.h文件,需要把这里的路径换成符合需要的工程的路径。LIBS这一行告诉编译器到哪里找到这个dll文件。如果使用的vs编译器需要写成LIBS += -L$$DESTDIR -lTestWidget 。

然后可以试着调用之前写的程序

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
#include 
#include "mydialog.h"
 
  
CMainWindow::CMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CMainWindow)
{
    ui->setupUi(this);
}
 
  
CMainWindow::~CMainWindow()
{
    delete ui;
}
 
  
void CMainWindow::on_pushButton_clicked()
{
    MyDialog * my = new MyDialog(this);
    my->show();\
    QMessageBox *msg = new QMessageBox(this);
    CTestWidget s;
    msg->setText(s.GetStr());
    msg->show();
}
 
  

在界面上添加一个按钮,调用显示先前文件的mydialog界面,在界面上创建一个显示框,框里显示textwidget里编写的程序。运行显示成功。

参考链接1

参考链接2



你可能感兴趣的:(动态库)