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

目录

前提

一、下载qrencode库

二、qt编译qrencode库

2.1 编译静态链接库

2.2 编译动态链接库

三、qt项目中如何引用qrencode库

3.1如何引用静态链接库

3.2如何引用动态链接库

四、示例代码以及编译库资源


前提

1. window 10操作系统

2. 已安装了Qt6.7.0版本,官方下载网站一步到位:Download Qt OSS: Get Qt Online Installer

    另外QT5版本也适用。

一、下载qrencode库

进入官网下载二维码库,libqrencode

然后解压,里面包含源码,重点关注 config.h.in 文件,重命名为 config.h ,编译成功与否就在于这个文件。

二、qt编译qrencode库

2.1 编译静态链接库

1、qt新建一个C++的库项目

库项目的名称,可以直接命名为“qrencode”,后面编程生产的库就直接为libqrencode.a

!!!注意:header file和source file栏,默认的文件为“qrencode.h、qrencode.cpp”,此处需要修改下,不能用此名称,例如修改为“qrencode_main.h、qrencode_main.cpp”。

因为下载的qrencode源码中就存在qrencode.h、qrencode.c。故新建的文件不能与此同名,否则会导致编译失败。

类型:选择静态链接库类型

然后工程中添加现有文件,将源码中所有的.h、.c文件都引入,除了qrenc.c文件。(该文件中包含main函数,用于测试所用,静态库中无需包含该部分)

在工程的.pro文件中添加:

DEFINES += HAVE_CONFIG_H

开始编译,会弹出如下编译错误:

说明宏未定义,需要对此宏进行定义。因为在config.h文件中,这些宏都是关闭定义状态。

在config.h文件中,增加如下代码:

#define MAJOR_VERSION 1
#define MICRO_VERSION 1
#define MINOR_VERSION 1
#define VERSION "1.1.1"

然后即可编程成功。

在编译目录下,即可获得qrencode的静态库文件(libqrencode.a):

2.2 编译动态链接库

步骤基本同上,不同点如下:

!!!注意:header file和source file栏,默认的文件为“qrencode.h、qrencode.cpp”,此处需要修改下,不能用此名称,例如修改为“qrencode_shard.h、qrencode_shard.cpp”。

后续编译时,需要将这两个文件以及qrencode_global.h删除。

类型:选择动态链接库类型

另外:需要将qrencode_shard.h、qrencode_shard.cpp、qrencode_global.h删除,然后再进行编译。

如果不删除,动态dll中的导出函数将变成qrencode_shared.h定义的Qrencode导出类了。

在编译目录下,即可获得qrencode的动态库文件(qrencode.dll):

三、qt项目中如何引用qrencode库

3.1如何引用静态链接库

必备的两个文件:qrencode.h、libqrencode.a

工程目录数结构,可以参照如下:

bin文件夹:       存放最后编译的工程app可执行文件

include文件夹:存放第三方库依赖的头文件,qrencode.h

libs文件夹:      存放静态链接库,libqrencode.a

文件放置后,开始在工程项目中引用它:

然后下一步,即可在.pro文件中自动添加如下的信息:

win32: LIBS += -L$$PWD/../libs/ -lqrencode

INCLUDEPATH += $$PWD/../include


DEPENDPATH += $$PWD/../include

win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../libs/qrencode.lib


else:win32-g++: PRE_TARGETDEPS += $$PWD/../libs/libqrencode.a

另外:指定项目放置.exe文件存放的路径为bin的方法,在.pro文件中增加:

DESTDIR = $$PWD/../bin #指定在何处放置目标文件

然后在工程中即可进行二维码的相关操作,在使用的地方进行“#include "qrencode.h"”。关键性代码如下:

#include "qrencode.h"


void MainWindow::on_pushButton_ok_clicked()
{
    QString text = ui->lineEdit_content->text();

    QPixmap qrPixmap;
    int width = ui->label_code->width();
    int height = ui->label_code->height();
    gernerateQRCode(text, qrPixmap, 10);
    qrPixmap = qrPixmap.scaled(QSize(width, height), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

    ui->label_code->setPixmap(qrPixmap);

}

void MainWindow::gernerateQRCode(const QString &text, QPixmap &qrPixmap, int scale)
{
    if(text.isEmpty()) {
        return;
    }

    //二维码数据
    QRcode *qrCode = nullptr;

    //这里二维码版本传入参数是2,实际上二维码生成后,它的版本是根据二维码内容来决定的
    qrCode = QRcode_encodeString(text.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    if(nullptr == qrCode) {
        return;
    }

    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_ARGB32_Premultiplied);

    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.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);
}

工程运行的效果图:

3.2如何引用动态链接库

大致步骤和“3.1如何引用静态链接库”一样,不同的地方如下几点:

必备的两个文件:qrencode.h、qrencode.dll

工程目录数结构,可以参照如下:

bin文件夹:       存放最后编译的工程app可执行文件、以及动态链接库,qrencode.dll

include文件夹:存放第三方库依赖的头文件,qrencode.h

文件放置后,开始在工程项目中引用它:

直接在.pro文件中进行引用:

win32: LIBS += $$PWD/../bin/qrencode.dll


INCLUDEPATH += $$PWD/../include

另外:指定项目放置.exe文件存放的路径为bin的方法,在.pro文件中增加:

DESTDIR = $$PWD/../bin #指定在何处放置目标文件

然后在工程中即可进行二维码的相关操作,在使用的地方进行“#include "qrencode.h"”。关键性代码和“3.1如何引用静态链接库”一样。

工程运行的效果图:

四、示例代码以及编译库资源

资源链接:

链接库编译代码:window下用Qt来编译qrencode链接库(静态链接库、动态链接库)

调用示例代码:window下Qt如何调用第三方库qrencode(静态链接库、动态链接库)的示例工程

  • 32
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值