目錄
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
????????特性與優勢
- 輸出格式:庫支持生成多種格式的輸出,包括PNG圖片、SVG矢量圖、ASCII文本形式的二維碼等,這取決于庫的具體實現和使用的接口。
- C++接口:對于C++,
qrencode
提供了豐富的類和方法來方便地生成二維碼。用戶可以創建一個QRcode
對象,向其中添加數據,然后將其渲染成所需的格式。 - 跨平臺:
qrencode
庫是跨平臺的,可以在多種操作系統上編譯和使用,包括Windows、Linux、macOS等。 - 生成能力:
qrencode
庫能夠生成不同版本和糾錯級別的QR碼,支持從最小的版本1(21x21的模塊)到最高的版本40(177x177的模塊),并且可以根據需要調整糾錯等級(L、M、Q、H)。 - C接口:對于C語言使用者,
qrencode
也提供了函數接口,通過這些函數可以直接操作二維碼數據結構,進行編碼和輸出。 - 依賴:在某些情況下,如生成PNG圖片輸出時,
qrencode
可能需要額外的依賴,如libpng
和zlib
庫。
2.編譯qrencode
- 下載源代碼
-
將qrencode-4.1.1解壓后,創建一個build文件夾;
-
打開Cmake,將qrencode-4.1.1文件夾下的CMakeLists.txt文件拖入CMake中;
-
點擊【Configure】;
-
這里我選擇了MSVC2017-64編譯器,點擊【Finish】;
? 6.如下圖所示進行配置,配置不正確會由于沒有準備依賴而報錯;
- 設置編譯后的安裝路徑為
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中引入編譯為靜態庫的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_VERSION
、MICRO_VERSION
、MINOR_VERSION
、VERSION
四項修改為如下所示,與自己下載的版本號相同;
-
然后就可以正常編譯了;
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.二維碼的原理竟如此簡單,第一次有人說的這么明白?