一、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++类、函数封装到静态库,其方法是一样的