Qt實(shí)現(xiàn)字符串生成二維碼功能
前言
最近在整理開發(fā)項(xiàng)目中遇到的知識(shí)點(diǎn),發(fā)現(xiàn)了一個(gè)特別有意思的功能:使用字符串生成二維碼操作。
下面是實(shí)現(xiàn)的效果圖
開發(fā)環(huán)境
WIN10環(huán)境 + VS2017 + Qt 5.14.2 64位開發(fā)環(huán)境
實(shí)現(xiàn)步驟
資源包數(shù)據(jù)
說(shuō)實(shí)話我的開發(fā)環(huán)境還真是挺麻煩的~
想要使用Qt使用二維碼功能,必須要外加 "qrencode"庫(kù)。針對(duì)我目前用的環(huán)境使用cmake編譯了一個(gè)dll庫(kù)
編譯出來(lái)的文件包含了兩個(gè):lib和src,如果跟我的開發(fā)環(huán)境不一致的,可以自行編譯,也是很快的(我發(fā)現(xiàn)camke真是一個(gè)好工具呀~)
配置屬性
1:頭文件設(shè)置
2:靜態(tài)庫(kù)設(shè)置
說(shuō)明:根據(jù)上述三張圖片中紅色區(qū)域部分進(jìn)行設(shè)置。
大家可以發(fā)現(xiàn)我設(shè)置的時(shí)候都有一個(gè)相同點(diǎn),全部使用了相對(duì)路徑。
一般多個(gè)人在做規(guī)模龐大的項(xiàng)目時(shí),都會(huì)采用相對(duì)路徑,即使每個(gè)人將項(xiàng)目放到了不同磁盤,也不會(huì)發(fā)生數(shù)據(jù)讀取的問(wèn)題。
說(shuō)到了這里,那么我就接著來(lái)說(shuō)一些關(guān)于配置的題外話吧~希望對(duì)你有幫助哦!
題外話:既然如此,我們生成的exe也會(huì)放到一個(gè)單獨(dú)的目錄中,假設(shè)我們叫做bin文件
在VS中默認(rèn)生成的exe會(huì)根據(jù)是debug或者release環(huán)境生成到對(duì)應(yīng)的文件夾中。當(dāng)前要將兩個(gè)環(huán)境合并需要修改配置屬性中的常規(guī)操作
最后,也需要在代碼中設(shè)置,將exe的生成目錄設(shè)置成當(dāng)前路徑,否則在程序中使用相對(duì)路徑時(shí),無(wú)法找到對(duì)應(yīng)文件!
QString qExePath = QCoreApplication::applicationDirPath(); QDir::setCurrent(qExePath);
這兩句話最好放到main.cpp中,讓整個(gè)項(xiàng)目生效。
二維碼操作
接下來(lái)便是我們的重頭戲了,如何使用字符串生成二維碼啦
1:創(chuàng)建QR操作類用于繪制QImage圖形
定義類:QORCodeOperation
#include <QPainter> #include <xstring> class CQRCodeOperation { public: CQRCodeOperation(); ~CQRCodeOperation(); QImage GeneratedGraphics(std::string sData, QSize nsize); //生成圖形 private: QPixmap m_imgIcon; };
函數(shù)(GeneratedGraphics)
傳入指定的字符串以及二維碼的寬度高度,返回圖形的QImage值。
一般情況下我們會(huì)將QIamge賦值到QLable上展示。
參數(shù)(m_imgIcon)
QPximap類型的成員變量,主要是繪制圖形,在最開始的顯示效果生可以看出二維碼中間添加了一張圖片,主要用于顯示圖片的。
2:生成二維碼圖形QImage
2.1:定義QImage對(duì)象存儲(chǔ)生成內(nèi)容
QImage image(nsize, QImage::Format_RGB32); image.fill(QColor("#000000"));
QImage存儲(chǔ)根據(jù)設(shè)置的nsize大小的寬度高度構(gòu)造一幅圖像,程序會(huì)自動(dòng)根據(jù)圖像格式對(duì)齊數(shù)據(jù),使用32位RGB格式的圖像(0xffrrggbb)
2.2:構(gòu)造繪圖指針
QPainter painter(&image); if (!painter.isActive()) { return image; }
構(gòu)造QPainter繪制指針,一般當(dāng)傳入的QSize數(shù)據(jù)為0時(shí),是無(wú)法進(jìn)行后續(xù)操作的,也就是isActiva = false
2.3:根據(jù)字符串獲取QRcode類實(shí)例
QRcode *qrCode = QRcode_encodeString(sData.c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 1);
2.4:設(shè)置點(diǎn)畫刷以及背景畫刷
QColor colorForPoint("#FFB6C1"); QColor colorForBackground("#ffffff"); painter.setBrush(colorForBackground); painter.setPen(Qt::NoPen); painter.drawRect(0, 0, image.width(), image.height()); painter.setBrush(colorForPoint);
2.5:繪制圖形
const double &&s = (qrCode->width > 0) ? (qrCode->width) : (1); const double &&aspect = image.width() / image.height(); const double &&scale = ((aspect > 1.0) ? image.height() : image.width()) / s; for (int y = 0; y < s; ++y) { const int &&yy = static_cast<int>(y * s); for (int x = 0; x < s; ++x) { const int &&xx = yy + x; const unsigned char &b = qrCode->data[xx]; if (b & 0x01) { const double rx1 = x * scale, ry1 = y * scale; QRectF r(rx1, ry1, scale, scale); painter.drawRects(&r, 1); } } }
這里為了偷懶再判斷寬度值時(shí)采用了三目運(yùn)算符操作。
2.6:釋放QRcode指針
QRcode_free(qrCode);
2.7:添加二維碼圖形
其實(shí)我們?cè)谥虚g展示的圖片比較小,直接覆蓋到二維碼上就可以了
painter.setRenderHint(QPainter::Antialiasing, true); //抗鋸齒 int nLeft = (nsize.width() - 30) / 2; int nTop = (nsize.height() - 30) / 2; QRect rectPng(nLeft, nTop,30,30); painter.drawPixmap(rectPng, m_imgIcon);
2.8:結(jié)束繪制
painter.end();
到這里具體的二維碼繪制已經(jīng)完成了,對(duì)外我們只需要返回存儲(chǔ)繪制數(shù)據(jù)的QImage就可以了。
3:二維碼函數(shù)調(diào)用
CQRCodeOperation dlg; QImage img = dlg.GeneratedGraphics(sText, QSize(250, 250)); ui.labPng->setPixmap(QPixmap::fromImage(img));
總結(jié)
到這里字符串生成二維碼功能就講解完成了,難度不是很大,只要將環(huán)境配置成功就完成了一般的功能了,剩下的就是根據(jù)你的想法,想要如何展示了。
以上就是Qt實(shí)現(xiàn)字符串生成二維碼功能的詳細(xì)內(nèi)容,更多關(guān)于Qt字符串生成二維碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06opencv3/C++圖像濾波實(shí)現(xiàn)方式
今天小編就為大家分享一篇opencv3/C++圖像濾波實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Qt進(jìn)程和線程QProcess和QThread的使用
本文主要介紹了Qt進(jìn)程和線程QProcess和QThread的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06vs運(yùn)行時(shí)報(bào)C4996代碼錯(cuò)誤的問(wèn)題解決
C4996錯(cuò)誤的意思:是VS覺(jué)得strcpy這函數(shù)不安全,建議你使更安全的函數(shù),那么如何解決呢,本文主要介紹了vs運(yùn)行時(shí)報(bào)C4996代碼錯(cuò)誤的問(wèn)題解決,感興趣的可以了解一下2024-01-01C++類與對(duì)象的重點(diǎn)知識(shí)點(diǎn)詳細(xì)分析
類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域2023-02-02C語(yǔ)言實(shí)現(xiàn)關(guān)機(jī)小程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)關(guān)機(jī)小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02深入探討Linux靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的詳解(一看就懂)
本篇文章是對(duì)Linux靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05