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

Qt實(shí)現(xiàn)字符串生成二維碼功能

 更新時(shí)間:2022年01月23日 17:10:33   作者:中國(guó)好公民st  
這篇文章主要介紹了如何利用Qt實(shí)現(xiàn)字符串生成二維碼功能,文中的實(shí)現(xiàn)過(guò)程講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下

前言

最近在整理開(kāi)發(fā)項(xiàng)目中遇到的知識(shí)點(diǎn),發(fā)現(xiàn)了一個(gè)特別有意思的功能:使用字符串生成二維碼操作。

下面是實(shí)現(xiàn)的效果圖

開(kāi)發(fā)環(huán)境

WIN10環(huán)境 + VS2017 + Qt 5.14.2 64位開(kāi)發(fā)環(huán)境

實(shí)現(xiàn)步驟

資源包數(shù)據(jù)

說(shuō)實(shí)話我的開(kāi)發(fā)環(huán)境還真是挺麻煩的~

想要使用Qt使用二維碼功能,必須要外加 "qrencode"庫(kù)。針對(duì)我目前用的環(huán)境使用cmake編譯了一個(gè)dll庫(kù)

編譯出來(lái)的文件包含了兩個(gè):lib和src,如果跟我的開(kāi)發(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)目放到了不同磁盤(pán),也不會(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類型的成員變量,主要是繪制圖形,在最開(kāi)始的顯示效果生可以看出二維碼中間添加了一張圖片,主要用于顯示圖片的。

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)畫(huà)刷以及背景畫(huà)刷

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++ Vector迭代器失效問(wèn)題的解決方法

    C++ Vector迭代器失效問(wèn)題的解決方法

    最近我學(xué)習(xí)了C++中的迭代器失效問(wèn)題,迭代器失效問(wèn)題是非常非常重要的,所以特意整理出來(lái)一篇文章供我們一起復(fù)習(xí)和學(xué)習(xí)
    2022-08-08
  • C++程序簡(jiǎn)單示例

    C++程序簡(jiǎn)單示例

    這篇文章主要給大家分享的是C++程序簡(jiǎn)單示例,下面文章將圍繞C++程序的相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • C++統(tǒng)計(jì)中英文大小寫(xiě)字母、數(shù)字、空格及其他字符個(gè)數(shù)的方法

    C++統(tǒng)計(jì)中英文大小寫(xiě)字母、數(shù)字、空格及其他字符個(gè)數(shù)的方法

    這篇文章主要介紹了C++統(tǒng)計(jì)中英文大小寫(xiě)字母、數(shù)字、空格及其他字符個(gè)數(shù)的方法,涉及C++字符串的遍歷與簡(jiǎn)單判定技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • 用c 獲取文件MD5值的實(shí)現(xiàn)方法

    用c 獲取文件MD5值的實(shí)現(xiàn)方法

    本篇文章是對(duì)用c語(yǔ)言獲取文件MD5值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言中的程序環(huán)境與預(yù)處理詳情

    C語(yǔ)言中的程序環(huán)境與預(yù)處理詳情

    這篇文章主要介紹了C語(yǔ)言中的程序環(huán)境與預(yù)處理詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長(zhǎng)度)

    C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長(zhǎng)度)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(58.求末尾單詞的長(zhǎng)度),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列

    C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 解析C++中的5個(gè)存儲(chǔ)類的作用

    解析C++中的5個(gè)存儲(chǔ)類的作用

    這篇文章主要介紹了C++中的5個(gè)存儲(chǔ)類的作用,存儲(chǔ)類是管理對(duì)象的生存期、鏈接和內(nèi)存位置的類型說(shuō)明符,需要的朋友可以參考下
    2016-05-05
  • C++ Sort函數(shù)使用場(chǎng)景分析

    C++ Sort函數(shù)使用場(chǎng)景分析

    sort函數(shù)是algorithm庫(kù)下的一個(gè)函數(shù),sort函數(shù)是不穩(wěn)定的,即大小相同的元素在排序后相對(duì)順序可能發(fā)生改變,如果某些場(chǎng)景需要保持相同元素間的相對(duì)順序,可使用stable_sort函數(shù),接下來(lái)通過(guò)本文給大家介紹C++ Sort函數(shù)詳解,感興趣的朋友一起看看吧
    2025-04-04
  • C++11中的變長(zhǎng)模板的示例詳解

    C++11中的變長(zhǎng)模板的示例詳解

    C++中的變長(zhǎng)模板真的是又臭又長(zhǎng),晦澀難懂,但是確實(shí)有些STL庫(kù)就是這么寫(xiě)的。本文就來(lái)和大家聊聊C++11中這些變長(zhǎng)模塊的使用,需要的可以參考一下
    2023-02-02

最新評(píng)論

沧州市| 宜兴市| 郯城县| 平远县| 轮台县| 汉沽区| 涿州市| 裕民县| 河西区| 大理市| 新丰县| 吉首市| 松原市| 庆阳市| 巧家县| 宜兴市| 梁河县| 巨野县| 新营市| 外汇| 札达县| 宜春市| 黄大仙区| 台山市| 永兴县| 恭城| 乡城县| 含山县| 聂拉木县| 子长县| 兰考县| 汕尾市| 新营市| 沂源县| 仁化县| 曲松县| 响水县| 辉县市| 阳西县| 南丹县| 九寨沟县|