Windows下用QT编译libqrencode静态库,用于显示二维码
1.下载qrencode源码,见官网 fukuchi.org/works/qrenc…
本文示例4.1.1版本,下载完成后解压备用
重点关注 config.h.in 文件,重命名为 config.h ,编译成功与否就在于这个文件
2.用Qt新建库 选择C++ Library
项目创建好后 导入qrencode中.c .h文件 准备编译工作 ,注意:qrenc.c 文件不需要导入,qrenc.c 文件不需要导入,qrenc.c 文件不需要导入
2.1 在项目 .pro 文件中添加 DEFINES += HAVE_CONFIG_H
2.2 现在开始修改 config.h 文件内容,否则代码构建项目时会提示错误,修改也很简单,根据报错内容修改就行
在 config.h 中找到对应字段 修改如下:只是修改版本号,让代码不报错就行
2.3 修改完成后重新构建,没有报错信息即可开始编译。
编译完成后,在创建的库项目里会生成 build-.. 文件夹
此处的 libqrlib.a 就是我们需要的编译完成后的静态库,此时我们创建的Library库的使命差不多就结束了。
- 把编译完成后的静态库 libqrlib.a 和源码里面的 qrencode.h 放入新建的文件夹libqrlib中,然后在自己的项目中引用即可。 右键项目 添加库 --> 外部库
库文件选择我们新建文件夹里面的 libqrlib.a 文件,其他根据提示即可,完成之后下一步,此时会在项目.pro 文件处为我们添加如下配置:但是要修改成 -llibqrlib ,-l 后是自己新建的文件夹名
- 最后还需要导入我们放入文件夹中的 qrencode.h 即可使用我们的二维码功能了。 在自己项目需要用到的地方头文件定义如下方法:
然后在C++中实现
具体实现如下:
void CustomMain::GernerateQRCode(const QString &text, QPixmap &qrPixmap, int scale){
//这里二维码版本传入参数是2,实际上二维码生成后,它的版本是根据二维码内容来决定的
QRcode *qrCode = QRcode_encodeString(text.toStdString().c_str(),2,QR_ECLEVEL_H,QR_MODE_8,1);
int qrCode_Width = qrCode->width > 0 ? qrCode->width : 1;
int width = scale * qrCode_Width;
int height = scale * qrCode_Width;
QImage image(width, height, QImage::Format_RGBA8888);
QPainter mPainter(&image);
QColor background(Qt::white);
mPainter.setBrush(background);
mPainter.setPen(Qt::NoPen);
mPainter.drawRect(0, 0, width, height);
QColor foreground(Qt::black);
mPainter.setRenderHint(QPainter::Antialiasing);
mPainter.setBrush(foreground);
for(int y = 0; y < qrCode_Width; ++y){
for(int x = 0; x < qrCode_Width; ++x){
unsigned char character = qrCode->data[y * qrCode_Width + x];
if(character & 0x01){
QRect rect(x * scale, y * scale, scale, scale);
mPainter.drawRects(&rect, 1);
}
}
}
qrPixmap = QPixmap::fromImage(image);
QRcode_free(qrCode);
}
void CustomMain::initQrCode(){
QPixmap qrPixmap;
int width = ui->label->width();
int height = ui->label->height();
GernerateQRCode("hello world", qrPixmap, 2);
qrPixmap = qrPixmap.scaled(QSize(width*0.9f, height*0.9f),
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->label->setAlignment(Qt::AlignCenter);
ui->label->setPixmap(qrPixmap);
}
到这里可能有人会发现问题了,当准备好了之后Qt提示 QRcode_encodeString 方法有问题
这里是我们在编译静态库时少了一个步骤,重新打开我们的Library库,在 .pro 文件中添加 CONFIG += staticlib
修改之后重新执行 2.3 步骤,生成新的静态库之后替换掉我们现在项目用到的库就可以了,心细的同学会发现 此时编译出的静态库文件大小远比之前的大了 最终效果如下: