分享

Qt:55---QT创建和使用静态链接库(.lib、.a)_qt生成lib文件

 beginnow1 2023-07-24 发布于广东

一、QT的静态链接库

  • QT创建一个静态链接库项目,设计各种需要导出的类,包括具有UI的窗体类、对话框类、编译后可以生成一个lib文件(MSVC编译器生成的文件后缀为“.lib”,MinGW编译器生成的文件后缀为“.a”)

  • 在另一个应用程序里使用这个lib文件和类的头文件(不需要cpp源文件),就可以静态编译到应用程序里

  • 这种方法适合于小组开发时,每个人负责自己的部分,使用其他人设计的代码时只能使用而不能看到源码,便于项目代码的管理

二、QT静态链接库的创建

第一步:

  • 点击“File”→“New File or Project”菜单项,选择“Library”中的“C++ Library”

第二步:

  • 在“Type”中选择“Statically Linked Library”,设置项目名称为“myStaticLib”

第三步:

  • 接下来选择的是编译器的版本,此处我们选择MSVC2015 645bit版本

  • 选择需要包含的QT模块。

  • 然后来到类定义页面,见下图,我们设置为“QWDialogPen”

第四步:

  • 这个静态库文件的功能需要自己去设计,可以只实现一个函数功能,也可以设计一个带有UI界面的应用

  • 此处,我们将静态库文件设计为一个带有UI界面的对话框,然后将其封装为静态库文件给其他项目调用。这个UI对话框的代码我们在别处已经定义好了,因此我们将那个项目的代码直接复制到这个静态库项目的目录下(.ui文件也复制过来)

  • 那个项目是一个基于QDialog的对话框,用于设计字体,并且类名也为QWdialogPen。见下图

  • 我们直接将那个项目的“qwdialogpen.h”、“qwdialogpen.cpp”、“qwdialogpen.ui”复制到此静态库项目的文件夹下(类名都是相同的直接覆盖)

  • .h内容如下

namespace Ui {
class QWDialogPen;
}
 
class QWDialogPen : public QDialog
{
    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:
    Ui::QWDialogPen *ui;
};
  • .cpp内容如下

void QWDialogPen::setPen(QPen pen)
{
    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=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对象
}
  • 复制之后重新生成项目,并且右击静态库项目“Add Existing Files”将.ui文件添加进去

第五步:

项目文件(.pro)的内容如下

  • TEMPLATE定义项目模板是库,而不是应用程序

  • CONFIG:配置项目为静态库

  • TARGET:定义项目编译后生成的目标文件名称为myStaticLib

QT       += widgets
#QT       -= gui //这一行注释掉
 
TARGET = myStaticLib
TEMPLATE = lib
CONFIG += staticlib
 
DEFINES += QT_DEPRECATED_WARNINGS
 
SOURCES +=         qwdialogpen.cpp
 
HEADERS +=         qwdialogpen.h
unix {
    target.path = /usr/lib
    INSTALLS += target
}
 
FORMS +=     qwdialogpen.ui

第六步:

  • 将项目在MSVC2015 64bit编译器版本下的debug和release模式下分别编译

  • 编译时会出现这个对话框,不需要理会,因为静态库项目没有可执行的程序

  • 然后再对应的的build目录下会生成.lib文件,这个就是我们最终生成的静态库文件(注意debug版本的lib文件不会再文件名后加一个字符“d”)

三、静态库文件的使用

第一步:

  • 新建一个名为“LibUser”的项目,项目是一个基于QMainWindows的应用程序,类名为“setPen”。

  • 在项目源程序目录下新建一个include目录(这个目录名称自己设计)

然后根据使用的编译器复制不同的文件

  • 若使用MSVC编译器:将静态库项目myStaticLib下的qwdialogpen.h、release版本的myStaticLib.lib复制到这个include目录下、将debug版本的myStaticLib.lib更名为myStaticLibd.lib复制到这个include目录下,以便于程序在debug和release模式下编译时调用特定类型的文件

  • 若使用MinGW编译器:就将libmyStaticLib.a和libmyStaticLibd.a(debug版本)复制到include目录里

第二步:

  • 右击项目,添加库文件

  • 然后选择第二项

  • 然后选择静态库文件,Include path会自动填充;然后选择Windows系统;选择Dynamic模式,勾选“Add “d” suffix....”使得在debug模式下编译应用程序时将自动调用debug版本的库文件myStaticLibd.lib

  • 然后会在项目文件中自动添加以下内容

第三步:

  • 右击项目,运行一下“Run qmake”

  • 在项目文件中添加我们刚才添加的静态库头文件,这样才可以使用里面的内容

第四步:

  • 在项目中定义一个mPen成员和paintEvent函数

第五步:

  • 开始设计LibUser项目,在工具栏添加一个Action工具栏按钮,这个按钮等下用来调用我们静态库中的字体对话框

  • 编写Action对象的triggered函数,在此函数中调用我们的qwdialogpen类的getPen函数打开字体设置对话框,并进行操作

void MainWindow::on_action_Pen_triggered()
{
    bool ok=false;
    QPen pen=QWDialogPen::getPen(mPen,ok);
    if(ok)
    {
        mPen=pen;
        this->repaint();
    }
}
  • 定义paintEvent函数

void setPen::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    QRect rect(0,0,width(),height());
    painter.setViewport(rect);
    painter.setWindow(0,0,100,50);
    painter.setPen(mPen);
    painter.drawRect(10,10,80,30);
}

运行结果:

  • 本案例是将一个可视化的对话框QWDialogPen封装到一个静态库里,当然也可以将任何C++类、函数封装到静态库,其方法是一样的

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多