一、QT的静态链接库QT创建一个静态链接库项目,设计各种需要导出的类,包括具有UI的窗体类、对话框类、编译后可以生成一个lib文件(MSVC编译器生成的文件后缀为“.lib”,MinGW编译器生成的文件后缀为“.a”) 在另一个应用程序里使用这个lib文件和类的头文件(不需要cpp源文件),就可以静态编译到应用程序里 这种方法适合于小组开发时,每个人负责自己的部分,使用其他人设计的代码时只能使用而不能看到源码,便于项目代码的管理
二、QT静态链接库的创建第一步:
第二步:
第三步:
第四步:这个静态库文件的功能需要自己去设计,可以只实现一个函数功能,也可以设计一个带有UI界面的应用 此处,我们将静态库文件设计为一个带有UI界面的对话框,然后将其封装为静态库文件给其他项目调用。这个UI对话框的代码我们在别处已经定义好了,因此我们将那个项目的代码直接复制到这个静态库项目的目录下(.ui文件也复制过来) 那个项目是一个基于QDialog的对话框,用于设计字体,并且类名也为QWdialogPen。见下图
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;
}; 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对象
}
第五步:项目文件(.pro)的内容如下 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 第六步:
三、静态库文件的使用第一步:然后根据使用的编译器复制不同的文件 若使用MSVC编译器:将静态库项目myStaticLib下的qwdialogpen.h、release版本的myStaticLib.lib复制到这个include目录下、将debug版本的myStaticLib.lib更名为myStaticLibd.lib复制到这个include目录下,以便于程序在debug和release模式下编译时调用特定类型的文件 若使用MinGW编译器:就将libmyStaticLib.a和libmyStaticLibd.a(debug版本)复制到include目录里
第二步:
第三步:
第四步:
第五步:void MainWindow::on_action_Pen_triggered()
{
bool ok=false;
QPen pen=QWDialogPen::getPen(mPen,ok);
if(ok)
{
mPen=pen;
this->repaint();
}
} 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);
} 运行结果:
|