243_QT_制作动态库,可以加载进自写使用的项目文件中,以及通过代码流程理解

65 篇文章 6 订阅

步骤

创建C++文件
在这里插入图片描述

  • dll头文件中的两个宏定义作用!!!必备

在这里插入图片描述
在这里插入图片描述

.

执行具体功能的头文件需要做一下处理,这样才能制作出动态库

  • 这里的执行具体功能的代码,可以直接拷贝写好的
  • 这里是一个画笔UI

![在这里插入图片描述](https://img-blog.csdnimg.cn/0ef5f6a703e9426ea02b88482d652ed8.png

  • 画笔执行的界面

在这里插入图片描述

  • 代码,其实还有个UI文件必须一起放进来,但是这里不让。。
  • 在这里插入图片描述
#ifndef QWDIALOGPEN_H
#define QWDIALOGPEN_H

#include    <QDialog>
#include    <QPen>
#include    "dll_global.h"
namespace Ui {
class QWDialogPen;
}

class DLLSHARED_EXPORT QWDialogPen : public QDialog
{ //QPen属性设置对话框
    Q_OBJECT
private:
    QPen    m_pen; //成员变量
public:
    explicit QWDialogPen(QWidget *parent = 0);
    ~QWDialogPen();

    void    setPen(QPen pen); //设置QPen,用于对话框的界面显示
    QPen    getPen(); //获取对话框设置的QPen的属性
    static  QPen    getPen(QPen  iniPen, bool &ok);  //静态函数

private slots:
    void on_btnColor_clicked();
private:
    Ui::QWDialogPen *ui;
};

#endif // QWDIALOGPEN_H

cpp

#include "qwdialogpen.h"
#include "ui_qwdialogpen.h"

#include    <QColorDialog>

// 若MSVC 编译版本错误,修改 msvc-version.conf 文件
// 解决MSVC编译时,界面汉字乱码的问题
#if _MSC_VER >= 1600     //MSVC2015>1899,    MSVC_VER= 14.0
#pragma execution_character_set("utf-8")
#endif


QWDialogPen::QWDialogPen(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QWDialogPen)
{
    ui->setupUi(this);

//“线型”ComboBox的选择项设置
    ui->comboPenStyle->clear();
    ui->comboPenStyle->addItem("NoPen",0);
    ui->comboPenStyle->addItem("SolidLine",1);
    ui->comboPenStyle->addItem("DashLine",2);
    ui->comboPenStyle->addItem("DotLine",3);
    ui->comboPenStyle->addItem("DashDotLine",4);
    ui->comboPenStyle->addItem("DashDotDotLine",5);
    ui->comboPenStyle->addItem("CustomDashLine",6);

    ui->comboPenStyle->setCurrentIndex(1);
}

QWDialogPen::~QWDialogPen()
{
    delete ui;
}

void QWDialogPen::setPen(QPen pen)
{ //设置QPen,并刷新显示界面
    m_pen=pen;

    ui->spinWidth->setValue(pen.width()); //线宽
    int i=static_cast<int>(pen.style());  //枚举类型转换为整型
    ui->comboPenStyle->setCurrentIndex(i);

    QColor  color=pen.color();
    ui->btnColor->setAutoFillBackground(true); //设置颜色按钮的背景色
    QString str=QString::asprintf("background-color: rgb(%d, %d, %d);",
                                  color.red(),color.green(),color.blue());
    ui->btnColor->setStyleSheet(str);
}

QPen QWDialogPen::getPen()
{//获得设置的属性
    m_pen.setStyle(Qt::PenStyle(ui->comboPenStyle->currentIndex())); //线型
    m_pen.setWidth(ui->spinWidth->value()); //线宽

    QColor  color;
    color=ui->btnColor->palette().color(QPalette::Button);
    m_pen.setColor(color); //颜色
    return  m_pen;
}

QPen QWDialogPen::getPen(QPen iniPen,bool &ok)
{ //静态函数,获取QPen
    QWDialogPen *Dlg=new QWDialogPen; //创建一个对话框
    Dlg->setPen(iniPen); //设置初始化QPen

    QPen    pen;
    int ret=Dlg->exec(); //弹出对话框
    if (ret==QDialog::Accepted)
    {
        pen=Dlg->getPen(); //获取
        ok=true;    }
    else
    {
        pen=iniPen;
        ok=false;   }

    delete  Dlg; //删除对话框对象
    return  pen; //返回设置的QPen对象
}

void QWDialogPen::on_btnColor_clicked()
{//设置颜色
    QColor  color=QColorDialog::getColor();
    if (color.isValid())
    { //用样式表设置QPushButton的背景色
        QString str=QString::asprintf("background-color: rgb(%d, %d, %d);",
                                      color.red(),color.green(),color.blue());
        ui->btnColor->setStyleSheet(str);
    }
}

.
.

出现DLL、.a的地方,以及要放入include的两个.h文件(自己创建的临时文件,充当外部库)

  • DLL执行文件,.a(debug下的库文件,我们需要加载的外部库

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

.
.

执行地点:

在这里插入图片描述

在这里插入图片描述在这里插入图片.
描述
.

.

DLL放到user执行文件的debug中,前面直接放到include中了,在添加外部库导入的时候,会直接识别到的,和我们制作动态库的目的不符合

在这里插入图片描述

在这里插入图片描述

利用一个按键的槽函数,理解动态库使用流程

 * 流程:
 * "triple"函数已经封装到DLL文件中(最上面第二张图片对应:#  define DLLSHARED_EXPORT Q_DECL_EXPORT)
 * 然后利用函数指针,去解析DLL中的函数,完成本地化(最上面第三张图片对应:#  define DLLSHARED_EXPORT Q_DECL_IMPORT)
 * 接着执行
void MainWindow::on_pushButton_clicked()
{
    /*
     * "载入DelphiDLL.DLL"
     * 动态库名称不可随意改变,一个DLL支持什么功能是特定好的
    */
    QLibrary myLib("DelphiDLL");

    if (myLib.isLoaded())
        QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第1处");
    typedef int (*FunDef)(int); //函数原定定义

    /*
     * 函数指针myTriple,已经指向了解析到的"triple"函数,
     * 函数返回值int类型,可接受传入变量int类型
     *
     * 流程:
     * "triple"函数已经封装到DLL文件中
     * 然后利用函数指针,去解析DLL中的函数,完成本地化
     * 接着执行
     *
    */
    FunDef myTriple = (FunDef) myLib.resolve("triple"); //解析DLL中的函数

    /*
     *这里“ myTriple”已经是解析成本地可识别的函数了
    */
    int V=myTriple(ui->spinInput->value()); //调用函数
    ui->spinOutput->setValue(V);
    if (myLib.isLoaded())
        QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第2处");

    myLib.unload();
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值