Windows下用QT编译libqrencode库,用于显示二维码

539 阅读3分钟

Windows下用QT编译libqrencode静态库,用于显示二维码

1.下载qrencode源码,见官网 fukuchi.org/works/qrenc…

本文示例4.1.1版本,下载完成后解压备用

微信截图_20230518083128.png

重点关注 config.h.in 文件,重命名为 config.h ,编译成功与否就在于这个文件

微信截图_20230518084118.png

2.用Qt新建库 选择C++ Library

微信截图_20230518083430.png

项目创建好后 导入qrencode中.c .h文件 准备编译工作 ,注意:qrenc.c 文件不需要导入,qrenc.c 文件不需要导入,qrenc.c 文件不需要导入

微信截图_20230518084810.png

2.1 在项目 .pro 文件中添加 DEFINES += HAVE_CONFIG_H

微信截图_20230518085225.png

2.2 现在开始修改 config.h 文件内容,否则代码构建项目时会提示错误,修改也很简单,根据报错内容修改就行

微信截图_20230518085745.png

config.h 中找到对应字段 修改如下:只是修改版本号,让代码不报错就行 微信截图_20230518090021.png 微信截图_20230518090038.png

2.3 修改完成后重新构建,没有报错信息即可开始编译。

QQ截图20230518091205.png

编译完成后,在创建的库项目里会生成 build-.. 文件夹

微信截图_20230518091703.png

此处的 libqrlib.a 就是我们需要的编译完成后的静态库,此时我们创建的Library库的使命差不多就结束了。

微信截图_20230518091854.png

  1. 把编译完成后的静态库 libqrlib.a 和源码里面的 qrencode.h 放入新建的文件夹libqrlib中,然后在自己的项目中引用即可。 右键项目 添加库 --> 外部库

QQ截图20230518092716.png

QQ截图20230518092732.png

微信截图_20230518093105.png

库文件选择我们新建文件夹里面的 libqrlib.a 文件,其他根据提示即可,完成之后下一步,此时会在项目.pro 文件处为我们添加如下配置:但是要修改成 -llibqrlib-l 后是自己新建的文件夹名

微信截图_20230518093738.png

  1. 最后还需要导入我们放入文件夹中的 qrencode.h 即可使用我们的二维码功能了。 在自己项目需要用到的地方头文件定义如下方法:

微信截图_20230518095223.png

然后在C++中实现

微信截图_20230518095534.png

微信截图_20230518095633.png 具体实现如下:

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 方法有问题

微信截图_20230518100827.png

这里是我们在编译静态库时少了一个步骤,重新打开我们的Library库,在 .pro 文件中添加 CONFIG += staticlib

微信截图_20230518101229.png

修改之后重新执行 2.3 步骤,生成新的静态库之后替换掉我们现在项目用到的库就可以了,心细的同学会发现 此时编译出的静态库文件大小远比之前的大了 最终效果如下:

微信截图_20230518102003.png