Qt中基于開源庫QRencode生成二維碼(附工程源碼鏈接)

目錄

1.QRencode簡介

2.編譯qrencode

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

3.1.添加源碼

3.2.用字符串生成二維碼

3.3.用二進制數據生成二維碼

3.4.界面設計

3.5.效果展示

4.注意事項

5.源碼下載


1.QRencode簡介

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

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

? ? ? ? 它的官網:libqrencode

????????特性與優勢

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

2.編譯qrencode

  1. 下載源代碼
  2. 將qrencode-4.1.1解壓后,創建一個build文件夾;

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

  4. 點擊【Configure】;

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

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

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

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

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

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

? 在QT中引入編譯為靜態庫的QRencode

  • 創建一個工程,將編譯后的QRencode文件夾復制到工程中;

  • 在工程的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_VERSIONMICRO_VERSIONMINOR_VERSIONVERSION四項修改為如下所示,與自己下載的版本號相同;

  • 然后就可以正常編譯了;

3.2.用字符串生成二維碼

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

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.用二進制數據生成二維碼

????????調用?QRcode_encodeData?可以把圖片或其它二進制類型的數據轉換為二維碼,使用起來比較簡單,在這里就不多距離了。

3.4.界面設計

通過Qt Designer設計程序界面,包括:

  • 一個輸入框,用于接收用戶輸入的內容。

  • 一個按鈕,用戶點擊后觸發二維碼生成。

  • 一個顯示區域,用于實時展示生成的二維碼。

  • 一個按鈕,用戶點擊后保存二維碼,這個按鈕是動態生成的。

3.5.效果展示

程序運行效果如下圖所示:

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

4.注意事項

  • 二維碼無法識別:可能是由于二維碼生成時參數設置不當(如版本過低、容錯率過低等)或二維碼圖像質量不佳(如模糊、破損等)導致的。解決方案是調整參數或提高圖像質量。
  • 庫依賴問題:在編譯或運行QRencode時可能會遇到庫依賴問題。解決方案是確保系統中已安裝所有必要的庫文件,并使用包管理器進行管理和更新。
  • 錯誤處理:在實際應用中,你應該添加更多的錯誤處理代碼,比如檢查QRcode_encodeString的返回值是否為NULL,以及處理任何可能的異常或錯誤情況。

5.源碼下載

所有代碼都是在QT5.12.12版本基礎上編譯的。

您可以通過以下鏈接下載本項目的源碼:

通過網盤分享的文件:CreateQrcode_new.zip
鏈接: https://pan.baidu.com/s/1czmd-o_0Rcp06xDvJzKcVw?pwd=ben7 提取碼: ben7

參考:

1.二維碼的原理竟如此簡單,第一次有人說的這么明白?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895685.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android開發】華為手機安裝包安裝失敗“應用是非正式版發布版本,當前設備不支持安裝”問題解決

問題描述 我們將Debug版本的安裝包發送到手機上安裝&#xff0c;會發現華為手機有如下情況 解決辦法 在文件gradle.properties中粘貼代碼&#xff1a; android.injected.testOnlyfalse 最后點擊“Sync now”&#xff0c;等待重新加載gradle資源即可 后面我們重新編譯Debug安裝…

前端面試手寫--虛擬列表

目錄 一.問題背景 二.代碼講解 三.代碼改裝 四.代碼發布 今天我們來學習如何手寫一個虛擬列表,本文將把虛擬列表進行拆分并講解,然后發布到npm網站上. 一.問題背景 為什么需要虛擬列表呢?這是因為在面對大量數據的時候,我們的瀏覽器會將所有數據都渲染到表格上面,但是渲…

vue項目本地svg圖標使用

提前準備&#xff1a; 1、一個本地的svg圖片 這個直接從網上找一個就行 2、文件整體目錄 安裝插件 npm i vite-plugin-svg-iconsvite.config.ts中配置插件 完整代碼 import { fileURLToPath, URL } from node:url import { resolve } from path import { defineConfig } f…

Go: 使用VS Code配置Go項目支持Windows與Linux雙系統調試

在現代軟件開發中&#xff0c;越來越多的開發者開始使用VS Code等集成開發環境&#xff08;IDE&#xff09;來提高生產力&#xff0c;特別是在支持遠程開發時。VS Code的遠程SSH功能&#xff0c;使得開發者可以在本地Windows電腦上&#xff0c;通過遠程SSH連接到Linux服務器&am…

萌新學 Python 之集合 set

集合 set&#xff1a;使用一對大括號&#xff0c;元素寫在大括號之間&#xff0c;使用逗號分隔 集合中的元素只能是不可變的數據類型&#xff0c;不能是列表、字典和集合 set1 {1, 2, 3} set2 {1, a, (1, 2, 3)} print(type(set1), type(set2)) # <class set> <c…

python中使用數據庫sqlite3

Python使用sqlite3數據庫 python3.x標準庫內置了SQLite3 查看sqlite的版本 import sqlite3 sqlite_version sqlite3.sqlite_version print(f"SQLite version: {sqlite_version}") 顯示 導入模塊連接sqlitte3 import sqlite3 consqlite3.connect("d:/fi…

maven使用默認settings.xml配置時,Idea基于pom.xml更新依賴時報錯,有些組件下載時連接超時

1、問題背景&#xff1a;maven使用默認settings.xml配置時&#xff0c;Idea基于pom.xml更新依賴時報錯&#xff0c;有些組件下載時連接超時&#xff0c; 通過日志發下&#xff0c;去連接maven.org網站下載依賴&#xff0c;有時候肯定會超時。 2、解決辦法&#xff1a;使用國外…

小狐貍ai3.1.2版本源碼無授權版本內 含搭建教程+各種上線教程

內容目錄 一、詳細介紹小狐貍3.1.2版本源碼&#xff0c;新增deepseek接口 文件夾說明&#xff1a; 1、后端&#xff1a;文件夾是后臺文件 5、.sql文件是數據庫文件后臺安裝步驟&#xff1a; 1、在寶塔新建個站點&#xff0c;php版本使用7.4&#xff0c;將“后端”文件夾里的文件…

C#之上位機開發---------C#通信庫及WPF的簡單實踐

〇、上位機&#xff0c;分層架構 界面層 要實現的功能&#xff1a; 展示數據 獲取數據 發送數據 數據層 要實現的功能&#xff1a; 轉換數據 打包數據 存取數據 通信層 要實現的功能&#xff1a; 打開連接 關閉連接 讀取數據 寫入數據 實體類 作用&#xff1a; 封裝數據…

Python Django 入門教程

Django 構建一個完整的博客平臺,包含用戶認證、評論、權限控制等功能。 環境搭建 安裝依賴 先確保已經安裝了 Python 環境,并通過 pip 安裝 Django 及其它依賴: pip install django pip install djangorestframework創建項目和應用 創建一個 Django 項目并進入該項目目錄:…

今日行情明日機會——20250217

2025年02月17日行情 后續投資機會分析 根據最新盤面信息&#xff0c;以下板塊和個股具備潛在投資機會&#xff0c;需結合市場動態和基本面進一步驗證&#xff1a; 1. 騰訊系AI&#xff08;18家漲停&#xff09; 核心邏輯&#xff1a;漲停家數最多&#xff08;18家&#xff0…

常見的IP地址分配方式有幾種:深入剖析與適用場景?

在數字互聯的世界里&#xff0c;IP地址如同網絡世界的“門牌號”&#xff0c;是設備間通信的基礎。隨著網絡技術的飛速發展&#xff0c;IP地址的分配方式也日趨多樣化&#xff0c;以適應不同規模、不同需求的網絡環境。本文將深入探討當前主流的幾種IP地址分配方式&#xff0c;…

快速搭建 OLLAMA + DeepSeek 模型并對接 Cherry Studio

快速搭建 OLLAMA DeepSeek 模型并對接 Cherry Studio 本文將指導您在基于 GPU 的 Ubuntu 服務器上快速搭建 OLLAMA&#xff0c;部署 DeepSeek 模型&#xff0c;并接入 Cherry Studio 進行使用。 環境說明 GPU 服務器: GeForce RTX 2080 Ti, 16 核, 64G 內存系統: Ubuntu 24.…

floodfill算法系列一>掃雷游戲

目錄 題目思路&#xff1a;代碼設計&#xff1a;代碼呈現&#xff1a; 題目思路&#xff1a; 代碼設計&#xff1a; 代碼呈現&#xff1a; class Solution {int m,n;int[] dx {0,0,-1,1,-1,-1,1,1};int[] dy {-1,1,0,0,-1,1,-1,1};public char[][] updateBoard(char[][] boa…

Java 中操作文件

文章目錄 Java 中操作文件File 概述屬性構造方法方法代碼示例文件內容的讀寫--數據流InputStream 概述常用方法FileInputStream 概述構造方法常用方法代碼示例通過 Scanner 進行字符讀取FileReaderOutputStream 概述常用方法FileOutputStream 概述構造方法常用方法代碼示例File…

什么是RDD以及它在Spark中的作用

RDD&#xff08;Resilient Distributed Dataset&#xff09;&#xff0c;即彈性分布式數據集&#xff0c;是Spark中最基本的數據抽象。以下是對RDD的詳細解釋以及它在Spark中的作用&#xff1a; 一、RDD的定義與特性 定義&#xff1a; RDD是一個不可變、可分區、里面的元素可并…

【附帶腳本】解決notion加載慢問題

問題原因 notion網站的服務器在國外&#xff0c;因為網絡問題&#xff08;國際出口帶寬限制&#xff09;導致訪問速度較慢和域名解析延遲等問題。 解決方案 通過在 hosts 文件中直接指定一個更快的 IP 地址&#xff08;例如國內鏡像服務器&#xff09;&#xff0c;可以顯著提…

Banana Pi OpenWRT One 官方路由器的第一印象

OpenWRT One是OpenWRT開源社區推出的首款官方開發板&#xff0c;與Banana Pi社區共同設計&#xff0c;由Banana Pi制造和發行。路由器采用藍色鋁合金外殼&#xff0c;質感極佳&#xff0c;視覺效果遠超宣傳圖。整體設計簡潔&#xff0c;呈長方形&#xff0c;雖然不是特別時尚&a…

【信息學奧賽一本通 C++題解】1285:最大上升子序列和

信息學奧賽一本通&#xff08;C版&#xff09;在線評測系統 基礎算法 第一節 動態規劃的基本模型 1285&#xff1a;最大上升子序列和 “最大上升子序列和”問題課堂講解 1. 理解題意 同學們&#xff0c;想象我們有一串數字&#xff0c;就像一串彩色的珠子&#xff0c;每個珠子…

刷題記錄Day4(補)

24. 兩兩交換鏈表中的節點 ① 使用虛擬節點 ② 最后返回頭結點的時候&#xff0c;head 本來的頭節點已經和第二位交換了&#xff0c;需要重新賦值 ③ 使用臨時指針保存變量 ④ 如果是空的不用特殊判斷&#xff0c;空的返回頭節點也還是空的 class Solution { public:ListNo…