最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt基于QRencode實現(xiàn)生成二維碼

 更新時間:2025年02月19日 08:36:18   作者:流星雨愛編程  
QRencode是一個開源的庫,專門用于生成二維碼(QR?Code),這篇文章主要為大家詳細介紹了Qt如何使用QRencode實現(xiàn)生成二維碼功能,需要的可以參考下

1.QRencode簡介

QRencode是一個開源的庫,專門用于生成二維碼(QR Code)。它支持多種編程語言的接口,包括C、C++、Python等。QR碼是一種矩陣式二維碼,常用于存儲網(wǎng)址、聯(lián)系信息、文字信息等,廣泛應(yīng)用于各種場景,如產(chǎn)品追蹤、廣告宣傳、文檔管理等。

QRencode的設(shè)計簡潔高效,提供了易于使用的API接口,使得開發(fā)者能夠輕松地在應(yīng)用程序中集成QR碼生成和處理功能。

它的官網(wǎng):libqrencode

特性與優(yōu)勢

  • 輸出格式:庫支持生成多種格式的輸出,包括PNG圖片、SVG矢量圖、ASCII文本形式的二維碼等,這取決于庫的具體實現(xiàn)和使用的接口。
  • C++接口:對于C++,qrencode提供了豐富的類和方法來方便地生成二維碼。用戶可以創(chuàng)建一個QRcode對象,向其中添加數(shù)據(jù),然后將其渲染成所需的格式。
  • 跨平臺:qrencode庫是跨平臺的,可以在多種操作系統(tǒng)上編譯和使用,包括Windows、Linux、macOS等。
  • 生成能力:qrencode庫能夠生成不同版本和糾錯級別的QR碼,支持從最小的版本1(21x21的模塊)到最高的版本40(177x177的模塊),并且可以根據(jù)需要調(diào)整糾錯等級(L、M、Q、H)。
  • C接口:對于C語言使用者,qrencode也提供了函數(shù)接口,通過這些函數(shù)可以直接操作二維碼數(shù)據(jù)結(jié)構(gòu),進行編碼和輸出。
  • 依賴:在某些情況下,如生成PNG圖片輸出時,qrencode可能需要額外的依賴,如libpng和zlib庫。

2.編譯qrencode

1.下載源代碼

2.將qrencode-4.1.1解壓后,創(chuàng)建一個build文件夾;

3.打開Cmake,將qrencode-4.1.1文件夾下的CMakeLists.txt文件拖入CMake中;

4.點擊【Configure】;

5.這里我選擇了MSVC2017-64編譯器,點擊【Finish】;

6.如下圖所示進行配置,配置不正確會由于沒有準備依賴而報錯;

  • 設(shè)置編譯后的安裝路徑為C:/Users/MHF/Downloads/qrencode-4.1.1/QRencode;
  • 勾選WITHOUT_PNG,表示不支持png;
  • 取消勾選WITH_TOOLS,否則會報錯。

7.然后點擊【Generate】、【Open Project】打開VS;

8.鼠標右鍵選擇【ALL_BUILD】,點擊【生成】,然后選擇【INSTALL】,點擊【生成】;

9.就可以在安裝路徑下生成編譯好的文件了;

在QT中引入編譯為靜態(tài)庫的QRencode

  • 創(chuàng)建一個工程,將編譯后的QRencode文件夾復(fù)制到工程中;
  • 在工程的pro文件中添加下列代碼;
CONFIG(debug, debug|release): {
LIBS += -L$$PWD/QRencode/lib/ -lqrencoded
}else{
LIBS += -L$$PWD/QRencode/lib/ -lqrencode
}
INCLUDEPATH += $$PWD/QRencode/include
DEPENDPATH += $$PWD/QRencode/include

3.在Qt中直接使用QRencode源碼

3.1.添加源碼

將qrencode-4.1.1文件夾中除了.h、.c、config.h.in外的文件刪除,文件夾也刪除,qrenc.c也刪除;

將config.h.in重命名為config.h;

在pro文件中添加所有.h 、.c文件;

注意:還需要添加DEFINES += HAVE_CONFIG_H

編譯后會報錯error: C2065: “MAJOR_VERSION”: 未聲明的標識符

打開config.h文件,如下圖所示;

MAJOR_VERSION、MICRO_VERSION、MINOR_VERSION、VERSION四項修改為如下所示,與自己下載的版本號相同;

然后就可以正常編譯了;

3.2.用字符串生成二維碼

使用 QRcode_encodeString 或其他相關(guān)函數(shù)來生成二維碼數(shù)據(jù)。這個函數(shù)會返回一個 QRcode 結(jié)構(gòu)體,其中包含了二維碼的像素數(shù)據(jù)。將 QRcode 結(jié)構(gòu)體中的數(shù)據(jù)轉(zhuǎn)換為圖像格式,以便在屏幕上顯示或打印出來。通常,你會遍歷二維碼的每個像素,并根據(jù)像素值(0 或 1)來設(shè)置圖像的對應(yīng)像素為黑色或白色。

void QRCodeDemo::setCodeString(const QString& strCodeString)
{
    m_strCodeString = strCodeString;
}
 
void QRCodeDemo::paintEvent(QPaintEvent *event)
{
    QRcode *qrcode;
    qrcode = QRcode_encodeString(m_strCodeString.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    if (nullptr == qrcode)
    {
        return QWidget::paintEvent(event);
    }
    qint32 temp_width = ui.label->width();
    qint32 temp_height = ui.label->height();
    qint32 qrcode_width = qrcode->width > 0 ? qrcode->width : 1;
    double scale_x = (double)temp_width / (double)qrcode_width;
    double scale_y = (double)temp_height / (double)qrcode_width;
    //QImage mainimg = QImage(temp_width, temp_height, QImage::Format_ARGB32);
    m_qrcodeImage = QImage(temp_width, temp_height, QImage::Format_ARGB32);
    QPainter painter(&m_qrcodeImage);
 
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, temp_width, temp_height);
    QColor foreground(QColor("#002266")); // 二維碼顏色
    painter.setBrush(foreground);
    qDebug()<<qrcode_width<<qrcode_width;
    for (qint32 y = 0; y < qrcode_width; y++)
    {
        for (qint32 x = 0; x < qrcode_width; x++)
        {
            unsigned char b = qrcode->data[y*qrcode_width + x];
            if (b & 0x01)
            {
                QRectF r(x*scale_x, y*scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
 
    ui.label->setPixmap(QPixmap::fromImage(m_qrcodeImage));
    return QWidget::paintEvent(event);
}
 
void QRCodeDemo::on_pushButton_clicked()
{
    setCodeString(ui.lineEdit->text());
}

保存二維碼圖片:

void QRCodeDemo::on_pushButton_2_clicked()
{
    QString path("./12334434556.jpg");
    m_qrcodeImage.save(path);
}

3.3.用二進制數(shù)據(jù)生成二維碼

調(diào)用 QRcode_encodeData 可以把圖片或其它二進制類型的數(shù)據(jù)轉(zhuǎn)換為二維碼,使用起來比較簡單,在這里就不多距離了。

3.4.界面設(shè)計

通過Qt Designer設(shè)計程序界面,包括:

一個輸入框,用于接收用戶輸入的內(nèi)容。

一個按鈕,用戶點擊后觸發(fā)二維碼生成。

一個顯示區(qū)域,用于實時展示生成的二維碼。

一個按鈕,用戶點擊后保存二維碼,這個按鈕是動態(tài)生成的。

3.5.效果展示

點擊保存按鈕,會在當前運行目錄下生成相應(yīng)的二維碼圖片:

4.注意事項

二維碼無法識別:可能是由于二維碼生成時參數(shù)設(shè)置不當(如版本過低、容錯率過低等)或二維碼圖像質(zhì)量不佳(如模糊、破損等)導(dǎo)致的。解決方案是調(diào)整參數(shù)或提高圖像質(zhì)量。

庫依賴問題:在編譯或運行QRencode時可能會遇到庫依賴問題。解決方案是確保系統(tǒng)中已安裝所有必要的庫文件,并使用包管理器進行管理和更新。

錯誤處理:在實際應(yīng)用中,你應(yīng)該添加更多的錯誤處理代碼,比如檢查QRcode_encodeString的返回值是否為NULL,以及處理任何可能的異?;蝈e誤情況。

以上就是Qt基于QRencode實現(xiàn)生成二維碼的詳細內(nèi)容,更多關(guān)于Qt QRencode二維碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入了解C++11中promise和future的使用

    深入了解C++11中promise和future的使用

    C++11中promise和future機制是用于并發(fā)編程的一種解決方案,用于在不同線程完成數(shù)據(jù)傳遞(異步操作)。Promise和Future提供了訪問異步操作結(jié)果的機制,可以在線程之間傳遞數(shù)據(jù)和異常消息。本文就來聊聊二者的使用,希望對大家有所幫助
    2022-11-11
  • C語言超詳細解析函數(shù)棧幀

    C語言超詳細解析函數(shù)棧幀

    在C語言中,每一個正在運行的函數(shù)都有一個棧幀與其對應(yīng),棧幀中存儲的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等
    2022-03-03
  • C/C++中虛基類詳解及其作用介紹

    C/C++中虛基類詳解及其作用介紹

    這篇文章主要介紹了C/C++中虛基類的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++實現(xiàn)迷宮算法實例解析

    C++實現(xiàn)迷宮算法實例解析

    這篇文章主要介紹了C++實現(xiàn)迷宮算法實例解析,是一個比較經(jīng)典的C++算法,有一定的學(xué)習(xí)與借鑒價值,需要的朋友可以參考下
    2014-07-07
  • C語言完整特性詳情

    C語言完整特性詳情

    這篇文章主要介紹了C# 10的相關(guān)資料方法,感興趣的朋友可以參考下文
    2021-08-08
  • C++實現(xiàn)加減乘除計算器

    C++實現(xiàn)加減乘除計算器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)加減乘除計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行

    VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行

    本文主要介紹了VisualStudio2022下配置 OpenMP多線程編程環(huán)境與運行,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • C語言詳細講解位運算符的使用

    C語言詳細講解位運算符的使用

    C語?既具有?級語?的特點,?具有低級語?的特性,如?持位運算就是其具體體現(xiàn)。這是因為,C語?最初是為取代匯編語?設(shè)計系統(tǒng)軟件?設(shè)計的,因此C語?必須?持位運算等匯編操作。位運算就是對字節(jié)或字內(nèi)的?進制數(shù)位進?測試、抽取、設(shè)置或移位等操作
    2022-04-04
  • C語言正則表達式操作示例

    C語言正則表達式操作示例

    這篇文章主要介紹了C語言正則表達式操作,結(jié)合實例形式分析了C語言正則匹配類似郵箱格式功能的實現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • C++?LeetCode1769移動所有球到每個盒子最小操作數(shù)示例

    C++?LeetCode1769移動所有球到每個盒子最小操作數(shù)示例

    這篇文章主要為大家介紹了C++?LeetCode1769移動所有球到每個盒子所需最小操作數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

贵州省| 迁安市| 克拉玛依市| 囊谦县| 德令哈市| 华阴市| 文山县| 高清| 阳谷县| 个旧市| 梁河县| 宁陕县| 台安县| 平湖市| 牟定县| 罗田县| 泸水县| 龙游县| 二连浩特市| 包头市| 兴海县| 锡林郭勒盟| 黔南| 博客| 宁津县| 宁南县| 香河县| 灯塔市| 奉新县| 仙游县| 宁南县| 海阳市| 阿拉善右旗| 江油市| 西青区| 潞西市| 香港 | 元氏县| 红安县| 肃宁县| 光山县|