步骤
创建C++文件
- dll头文件中的两个宏定义作用!!!必备
.
执行具体功能的头文件需要做一下处理,这样才能制作出动态库
- 这里的执行具体功能的代码,可以直接拷贝写好的
- 这里是一个画笔UI
- 画笔执行的界面
- 代码,其实还有个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();
}