Qt二维码生成器+复制到剪贴板

简介: Qt二维码生成器+复制到剪贴板

参考

原理

  • 看参考2

二维码主要构成包括以下几个元素:

  1. 定位图案(Position detection pattern):二维码中的三个大正方形用于识别二维码的位置和方向。

    1. 对齐图案(Alignment pattern):一些小正方形的集合,用于校正二维码图像在扫描时可能出现的倾斜和变形问题。

      1. 时序图案(Timing pattern):一条横向和一条纵向的线,表示二维码中的每个模块(Module)是黑色还是白色。时序图案也用于与定位图案和对齐图案配合确定二维码的位置和方向。
      2. 版本信息(Version information):二维码版本号和纠错等级等信息的编码。
      3. 数据和纠错编码:具体存储在二维码中的编码信息,包括数据编码和纠错编码。
QRcode *QRcode_encodeString(const char *string, int version,\
                       QRecLevel level, QRencodeMode hint, int casesensitive)
                       
-string 要转化成二维码的字符串
-version 生成二维码的版本号
-level 纠错能力
-hint 编码模式,包含中文要用QR_MODE_8 ,也就是UTF8
-casesensitive 是否区分大小写

代码

qrcode.h

  
#ifndef QRCODE_H
#define QRCODE_H

#include <QWidget>
#include "qrencode/qrencode.h"
#include<QString>
#include<QByteArray>
#include<QPainter>
#include<QBrush>
#include<QRectF>
#include<QClipboard>

QT_BEGIN_NAMESPACE
namespace Ui { class QRCODE; }
QT_END_NAMESPACE

class QRCODE : public QWidget

{
    Q_OBJECT

public:
    QRCODE(QWidget *parent = nullptr);
    ~QRCODE();

    void paintEvent(QPaintEvent *e) override;

private slots:
    void on_createPB_clicked();

    void on_copyPB_clicked();

private:
    Ui::QRCODE *ui;
    int size; // 每个小方格大小
    int xMargin;//边界
    int yMargin;//边界
    QPixmap centerIcon;
    QImage qrCodeQImage;
    QByteArray infoStr;
};

#endif // QRCODE_H

qrcode.cpp

#include "qrcode.h"
#include "ui_qrcode.h"

QRCODE::QRCODE(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QRCODE)
{
    ui->setupUi(this);
    ui->groupBox->setStyleSheet("color:green");
    setWindowTitle("二维码生成器");
    setWindowIcon(QIcon(":/icon.ico"));
    size=0; // 每个小方格大小
    xMargin=0;//边界
    yMargin=0;//边界
    centerIcon=QPixmap(":/center.png");
    infoStr="";

    on_createPB_clicked();
}

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

void QRCODE::paintEvent(QPaintEvent *e)
{
    QPainter paint(this);
    QBrush brush(Qt::black);
    paint.setBrush(brush);

    /*
     * QRcode *QRcode_encodeString(const char *string, int version,\
                       QRecLevel level, QRencodeMode hint, int casesensitive)
    string 要转化成二维码的字符串
    version 生成二维码的版本号
    level 纠错能力
    hint 编码模式,包含中文要用QR_MODE_8 ,也就是UTF8
    casesensitive 是否区分大小写
    */
    QRcode *mQRcode=QRcode_encodeString(infoStr.data(),7,QR_ECLEVEL_Q,QR_MODE_8,true);
    if(mQRcode==NULL)
        return;

    size=(this->width()-50)/mQRcode->width;
    xMargin= (this->width()/2)-(mQRcode->width*size)/2;
    yMargin= (this->height()/2)-(mQRcode->width*size)/2+ui->createPB->height();
    unsigned char *poin=mQRcode->data;

    QPixmap copyPixmap(QSize(mQRcode->width*size,mQRcode->width*size));
    copyPixmap.fill(Qt::transparent); //设置背景透明
    QPainter pixPainter(&copyPixmap);
    pixPainter.setBrush(brush);

    for (int x = 0; x < mQRcode->width; x++)
    {
        for (int y = 0; y < mQRcode->width; y++)
        {
            if(*poin & 1) // & 按位与,有0则0
            {
                QRectF r(x*size+xMargin,y*size+yMargin,size,size);
                paint.drawRect(r); // 绘制在窗口

                QRectF s(x*size,y*size,size,size);
                pixPainter.drawRect(s); // 绘制在copyPixmap对象
            }
            poin++;
        }
    }
    qrCodeQImage = copyPixmap.toImage();

    // 绘制中心图片
    double scale = 0.23; //中心图片比例
    double icon_size = (this->width()-2*xMargin)*scale;
    double ix = this->width()/2.0 - icon_size/2.0;
    double iy = this->height()/2.0 - icon_size/2.0;
    QRect iconR(ix,iy,icon_size,icon_size);
    paint.drawPixmap(iconR,centerIcon);
}


void QRCODE::on_createPB_clicked()
{
    QString inputStr=ui->lineEdit->text();
    if(inputStr.isEmpty())
        inputStr="请输入二维码信息";
    infoStr = inputStr.toUtf8();
    this->update();
}


void QRCODE::on_copyPB_clicked()
{
    // 使用QPixmap::copy()函数将矩形框范围内的像素数据拷贝到一张新的QPixmap对象中
    //QPixmap qrCodeImage = this->grab().copy(QRect(xMargin,yMargin,this->width()*2,this->width()*2));
    // 将新的QPixmap对象转换为QImage类型
    //qrCodeQImage = qrCodeImage.toImage();
    // 将QImage设置到剪贴板中
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setImage(qrCodeQImage);
}

效果

image.png

源码

Qt二维码生成器+复制到剪贴板

相关文章
|
存储 算法 Java
Qt三方库开发技术:二维码生成、识别以及条码识别
Qt三方库开发技术:二维码生成、识别以及条码识别
Qt三方库开发技术:二维码生成、识别以及条码识别
|
存储 Java C语言
Qt之二维码扫描
简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的。是所有信息数据的一把钥匙。应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共享等。 二维条码常用的码制: Data Matrix、MaxiCode、Aztec
3712 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
191 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
97 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
3月前
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
190 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02