Qt libqrencode二维码——QtWidgets

15 篇文章 0 订阅
本文介绍了如何使用Qt结合libqrencode库生成二维码,包括libqrencode的下载、编译以及在Qt中创建一个不可关闭的对话框来显示动态二维码的过程。作者还分享了自定义QRCodeDialog类的代码,用于调整二维码的大小和形状。
摘要由CSDN通过智能技术生成

前言

之前写过二维码的程序,但是在U盘上,没带,又重新找的网上资料写的。

网上二维码的生成,大多用到是第三方库libqrencode,这也一样:

效果图

本来是个动图的,都被和谐了,所以换成截图,而且还打码了。效果是二维码放在一个对话框里,可以移动,但是不可关闭,得靠代码逻辑控制关闭。

参考

主要参考下面的博客,这个作者写的很详细,给了第三库的下载路径,编译和使用示例,我在其基础上对二维码的显示形式进行了点修改,使其更为符合我的项目要求。

Qt + libqrencode 生成二维码_龚建波的博客-CSDN博客

 犹豫担心后面此文章链接失效,所以我还是对其进行了简单的记录。

libqrencode地址

官网地址:

libqrencode

我是在github上下载的源码:GitHub - fukuchi/libqrencode: A fast and compact QR Code encoding library

cmake编译libqrencode

 使用代码

自己封装了一个类QRCodeDialog,用来显示二维码(对话框),在参考博客代码的基础上进行了一些更改,比如二维码大小根据控件大小调整,二维码形状为正方形等,具体代码如下(ps:这里只特别浅显的使用了一下,具体关于库libqrencode的api并没有学习):

主要是用到了libqrencode里的函数

/**
 *
 * QRcode_encodeString 从字符串创建一个符号。库自动解析输入字符串并在二维码符号中编码.
 * @warning 禁用pthread时线程不安全.
 * @param string NUL('\0')结尾的C字符串.
 * @param version 符号版本.越大可容纳的信息越多.0则按实际内容确定
 * @param level 纠错等级,枚举.
 * @param hint 编码模式,utf8用QR_MODE_8.
 * @param casesensitive 区分大小写(1) 不区分(0).
 * @return 返回QRcode类的实例。结果QRcode的版本可能是大于指定的版本.
 * 出现错误时,返回NULL,设置errno以指示错误.
 * @throw EINVAL invalid input object.
 * @throw ENOMEM unable to allocate memory for input objects.
 * @throw ERANGE input data is too large.
 */
QRcode *QRcode_encodeString(const char *string, int version, 
         QRecLevel level, QRencodeMode hint, int casesensitive);

.h 文件

#ifndef QRCODEDIALOG_H
#define QRCODEDIALOG_H

#include <QDialog>
#include <QResizeEvent>
#include"qrencode.h"
#include<QMouseEvent>


namespace Ui {
class QRCodeDialog;
}

class QRCodeDialog : public QDialog
{
    Q_OBJECT

public:
    explicit QRCodeDialog(QWidget *parent = 0);
    ~QRCodeDialog();

    /**
     * @brief setQRCodeInfo 设置二维码信息
     * @param info 内容
     * @param casesensitive 区分大小写(1) 不区分(0).
     */
    void setQRCodeInfo(const QString& info, int casesensitive = 1);


protected:
    void resizeEvent(QResizeEvent* event)override;

    ...


private:

    QImage qrEncode(const QString& info, int casesensitive = 1);

private:
    Ui::QRCodeDialog *ui;
    QString m_strInfo;
    int m_iCasesensitive;


    ...
};

#endif // QRCODEDIALOG_H

.cpp文件

#include "QRCodeDialog.h"
#include "ui_QRCodeDialog.h"

#include <QPainter>
#include<QDebug>

QRCodeDialog::QRCodeDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QRCodeDialog)
  ,m_iCasesensitive(1)
{
    ui->setupUi(this);

    setModal(true);

    setWindowFlags(Qt::FramelessWindowHint | Qt::Tool|windowFlags());
    ui->label->setAlignment(Qt::AlignCenter);

}

QRCodeDialog::~QRCodeDialog()
{
    delete ui;
}

void QRCodeDialog::setQRCodeInfo(const QString &info, int casesensitive)
{
    m_strInfo=info;
    m_iCasesensitive=casesensitive;
}

void QRCodeDialog::resizeEvent(QResizeEvent *event)
{
    if(!m_strInfo.isEmpty())
    {
        QImage img = qrEncode(m_strInfo,m_iCasesensitive);
        QPixmap pix=QPixmap::fromImage(img);
        int width=qMin(ui->label->width(),ui->label->height());
        pix=pix.scaled(width,width);
        //ui->label->setPixmap(QPixmap::fromImage(img));
        ui->label->setPixmap(pix);
    }
    QDialog::resizeEvent(event);
}

QImage QRCodeDialog::qrEncode(const QString &info, int casesensitive)
{
    QImage ret; //放二维码图片结果
    int scale = 4; //方块绘制大小
    QByteArray info_data = info.toUtf8();
    QRcode* qr = QRcode_encodeString(info_data.constData(), 0, QR_ECLEVEL_Q, QR_MODE_8, casesensitive);
    if (qr && qr->width > 0)
    {
        int img_width = qr->width * scale;
        ret = QImage(img_width, img_width, QImage::Format_Mono); //mono位图
        QPainter painter(&ret);
        painter.fillRect(0, 0, img_width, img_width, Qt::white);//背景填充白色
        painter.setPen(Qt::NoPen);
        painter.setBrush(Qt::red); //黑色方块
        for (int y = 0; y < qr->width; y++) //行
        {
            for (int x = 0; x < qr->width; x++) //列
            {
                if (qr->data[y * qr->width + x] & 1) //1表示黑块
                {
                    QRect r(x * scale, y * scale, scale, scale);
                    painter.drawRect(r);
                }
            }
        }
        QRcode_free(qr);
    }
    return ret;
}

上面绘制的是黑白色,若是想改变颜色当然也是可以的:

调整QImage的格式,上面代码用的是QImage::Format_Mono,即为通常所讲的位图模式,若是此模式下,即使改变QPainter刷子的颜色,也是无法改变绘制的方块颜色,所以这里改一下

ret = QImage(img_width, img_width,QImage::Format_RGB32 );

修改背景颜色:

 painter.fillRect(0, 0, img_width, img_width,QColor(167,220,237));

修改方块的颜色

painter.setBrush(Qt::blue); 

 最终效果是这样的:

 

 

结束语

记录一下吧,省的又忘了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libqrencode是一个C语言编写的库,用于生成二维条形码。生成的二维码可以通过手机的CCD摄像机轻松扫描出来。该库具有很强的鲁棒性,可以生成容量多达7000个数字或4000个字符的二维码。\[1\] 要使用libqrencode生成二维码,你需要以下几个步骤: 1. 下载稳定版本的libqrencode源代码包,可以从http://fukuchi.org/works/qrencode/下载。 2. 解压下载的源代码包,将其中的.h和.c文件拷贝到一个文件夹中,例如命名为libqrencode。 3. 创建一个工程,选择适合你的平台(如OSX或iOS)的应用程序模板。 4. 将libqrencode文件夹中的源代码添加到你的工程中。 5. 根据你的需求,调用libqrencode提供的函数来生成二维码。 这样,你就可以使用libqrencode库来生成二维码了。请注意,具体的实现细节可能因你的开发环境和需求而有所不同。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [基于libqrencode二维码生成](https://blog.csdn.net/SkyNullCode/article/details/49934699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用libqrencode生成二维码,支持telphone,短信,url等](https://blog.csdn.net/u013295518/article/details/89680310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值