在qt开发中,由于一些公共组件可复用,故可以封装成一个dll文件在其项目中引入使用
环境
Qt5.14.2 mingw73_64 Cmake3.25.0
准备:创建dll工程库
在qt creator创建一个Library如下图步骤所示:
1. 选择C++ Library
2. 选择Cmake构建项目
3. 选择Widgets【重点 选择Widgets是构建控件使用】
4. 选择MinGW 64位构建
5. 创建完成一个工程目录
6. 出现下图说明构建成功了【在项目外面目录可以看到有Debug构建目录了】
dll工程代码
message.cpp
#include "message.h"
Message::Message(QWidget *parent)
: QWidget(parent)
{
this->resize(100,200);
}
void Message::info(){
msgbox->information(this,"提示","此操作不可逆");
}
Message::~Message(){
}
message.h
这里把生成的message_global.h里的代码拷过来直接放在message.h中,在需要此dll封装文件就不需要单独在引message_global.h文件了
#ifndef MESSAGE_H
#define MESSAGE_H
#if defined(MESSAGE_LIBRARY)
# define MESSAGE_EXPORT Q_DECL_EXPORT
#else
# define MESSAGE_EXPORT Q_DECL_IMPORT
#endif
#include <QWidget>
#include <QMessageBox>
#include <QDebug>
class Message: public QWidget
{
Q_OBJECT
public:
explicit Message(QWidget *parent = nullptr);
~Message();
public slots:
void info();
private:
QMessageBox *msgbox;
QWidget *widget;
};
#endif // MESSAGE_H
1. 在qt creator构建debug或release成功之后如下图
这里生成dll文件和.a文件可以在另一个工程使用了
使用封装好的dll
在qt creator中创建一个 application->Qt Widgets Application 工程
创建完成一个qt项目在该工程创建两个目录如图:
在将 libmessage.dll文件放在该工程外面debug目录中【有可执行文件.exe】 如图
使用
cmake.txt
cmake_minimum_required(VERSION 3.5)
project(usedll LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#CMAKE_CURRENT_SOURCE_DIR 当前目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
add_executable(usedll
main.cpp
mainwindow.cpp
mainwindow.h
)
target_link_libraries(usedll PRIVATE Qt5::Widgets ${CMAKE_CURRENT_SOURCE_DIR}/lib/libmessage.dll.a )
mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) {
this->resize(400,300);
btn = new QPushButton(this);
btn->move(100,100);
btn->setText("调用dll中弹框");
connect(btn,SIGNAL(clicked()),this, SLOT(toclick()));
msg = new Message(this);
}
void MainWindow::toclick(){
msg->info();
}
MainWindow::~MainWindow() {
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QDebug>
#include "include/message.h" // 引入dll工程中的头文件
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void toclick();
private:
Message *msg;
QPushButton *btn;
};
#endif // MAINWINDOW_H