Skip to content
Snippets Groups Projects
Commit 91dbcd1c authored by aleksandr.ledyaev's avatar aleksandr.ledyaev
Browse files

add QR code generator

[*] CellFrameDashboardGUI.pro; DapApplication.cpp
[+] QRCodeGenerator.h; QRCodeGenerator.cpp; QrCodeQuickItem
parent 396d3dac
No related branches found
No related tags found
1 merge request!11Cellframe clone
......@@ -69,7 +69,9 @@ OTHER_FILES += libdap-qt-ui-qml \
SOURCES += \
$$PWD/main.cpp \
$$PWD/DapServiceController.cpp \
DapApplication.cpp
DapApplication.cpp \
quickcontrols/qrcodequickitem.cpp \
thirdPartyLibs/QRCodeGenerator/QRCodeGenerator.cpp
RESOURCES += $$PWD/qml.qrc
......@@ -80,7 +82,9 @@ else: unix:!android: target.path = /opt/cellframe-dashboard/bin
HEADERS += \
$$PWD/DapServiceController.h \
DapApplication.h
DapApplication.h \
quickcontrols/qrcodequickitem.h \
thirdPartyLibs/QRCodeGenerator/QRCodeGenerator.h
include (../dap-ui-sdk/qml/libdap-qt-ui-qml.pri)
include (../dap-ui-sdk/core/libdap-qt.pri)
......
......@@ -3,6 +3,7 @@
#include <DapLogMessage.h>
#include <QIcon>
#include <QClipboard>
#include "quickcontrols/qrcodequickitem.h"
DapApplication::DapApplication(int &argc, char **argv)
:QApplication(argc, argv)
......@@ -68,6 +69,7 @@ void DapApplication::registerQmlTypes()
qmlRegisterType<DapLogMessage>("Demlabs", 1, 0, "DapLogMessage");
qmlRegisterType<DapWallet>("Demlabs", 1, 0, "DapWallet");
qmlRegisterType<DapWalletToken>("Demlabs", 1, 0, "DapWalletToken");
qmlRegisterType<QrCodeQuickItem>("Demlabs", 1, 0, "QrCodeQuickItem");
qRegisterMetaType<DapWallet>();
qRegisterMetaType<DapWalletToken>();
}
......
#include "qrcodequickitem.h"
#include "thirdPartyLibs/QRCodeGenerator/QRCodeGenerator.h"
#include <QPainter>
QrCodeQuickItem::QrCodeQuickItem(QQuickItem *parent) :
QQuickPaintedItem(parent),
m_qrEncode(new CQR_Encode),
m_successfulEncoding(false),
m_encodeImageSize(0)
{
}
QrCodeQuickItem::~QrCodeQuickItem()
{
delete m_qrEncode;
}
const QByteArray &QrCodeQuickItem::data() const
{
return m_data;
}
void QrCodeQuickItem::setData(const QByteArray &data)
{
if (m_data != data) {
m_data = data;
createQRImage();
update();
emit dataChanged();
}
}
bool QrCodeQuickItem::saveToFile(const QString &fileName, int width, int height) const
{
if (!m_successfulEncoding) {
qWarning("QrCodeQuickItem::saveToFile: QR code not generated");
return false;
}
QImage img(scaledQRImage(QSize(width, height)));
if (!img.save(fileName)) {
qWarning("QrCodeQuickItem::saveToFile: Save image error");
return false;
}
return true;
}
void QrCodeQuickItem::paint(QPainter *painter)
{
if (!m_successfulEncoding)
return;
QSize size(width(), height());
if (m_encodeImageScaled.isNull() || m_encodeImageScaledItemSize != size) {
m_encodeImageScaled = scaledQRImage(size);
m_encodeImageScaledItemSize = size;
}
painter->drawImage(QPoint((width() - m_encodeImageScaled.width()) / 2, (height() - m_encodeImageScaled.height()) / 2), m_encodeImageScaled);
}
void QrCodeQuickItem::createQRImage()
{
int levelIndex = 1;
int versionIndex = 0;
bool bExtent = true;
int maskIndex = -1;
m_successfulEncoding = m_qrEncode->EncodeData(levelIndex, versionIndex, bExtent, maskIndex, m_data.data());
if (m_successfulEncoding) {
int qrImageSize = m_qrEncode->m_nSymbleSize;
m_encodeImageSize = qrImageSize + (QR_MARGIN * 2);
m_encodeImage = QImage(m_encodeImageSize, m_encodeImageSize, QImage::Format_Mono);
m_encodeImage.fill(1);
for (int i = 0; i < qrImageSize; i++) {
for (int j = 0; j < qrImageSize; j++) {
if (m_qrEncode->m_byModuleData[i][j]) {
m_encodeImage.setPixel(i + QR_MARGIN, j + QR_MARGIN, 0);
}
}
}
} else {
qWarning("QrCodeQuickItem::setData: EncodeData error");
m_encodeImageSize = 0;
m_encodeImage = QImage();
}
m_encodeImageScaled = QImage();
m_encodeImageScaledItemSize = QSize();
}
QImage QrCodeQuickItem::scaledQRImage(const QSize &size) const
{
if (!m_successfulEncoding)
return QImage();
int scaleSize = m_encodeImageSize * (std::min(size.width(), size.height()) / m_encodeImageSize);
return m_encodeImage.scaled(scaleSize, scaleSize);
}
#ifndef QRCODEQUICKITEM_H
#define QRCODEQUICKITEM_H
#include <QQuickPaintedItem>
#include <QImage>
class CQR_Encode;
class QrCodeQuickItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QByteArray data READ data WRITE setData NOTIFY dataChanged)
public:
explicit QrCodeQuickItem(QQuickItem *parent = nullptr);
~QrCodeQuickItem() override;
const QByteArray &data() const;
void setData(const QByteArray &data);
Q_INVOKABLE bool saveToFile(const QString &fileName, int width, int height) const;
void paint(QPainter *painter) override;
signals:
void dataChanged();
private:
void createQRImage();
QImage scaledQRImage(const QSize &size) const;
private:
CQR_Encode *m_qrEncode;
QByteArray m_data;
bool m_successfulEncoding;
int m_encodeImageSize;
QImage m_encodeImage;
QImage m_encodeImageScaled;
QSize m_encodeImageScaledItemSize;
};
#endif // QRCODEQUICKITEM_H
This diff is collapsed.
#if !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_)
#define AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
//
#define QR_LEVEL_L 0
#define QR_LEVEL_M 1
#define QR_LEVEL_Q 2
#define QR_LEVEL_H 3
//
#define QR_MODE_NUMERAL 0
#define QR_MODE_ALPHABET 1
#define QR_MODE_8BIT 2
#define QR_MODE_KANJI 3
//
#define QR_VRESION_S 0
#define QR_VRESION_M 1
#define QR_VRESION_L 2
#define MAX_ALLCODEWORD 3706
#define MAX_DATACODEWORD 2956
#define MAX_CODEBLOCK 153
#define MAX_MODULESIZE 177
#define QR_MARGIN 4
/////////////////////////////////////////////////////////////////////////////
typedef struct tagRS_BLOCKINFO
{
int ncRSBlock;
int ncAllCodeWord;
int ncDataCodeWord;
} RS_BLOCKINFO, *LPRS_BLOCKINFO;
/////////////////////////////////////////////////////////////////////////////
typedef struct tagQR_VERSIONINFO
{
int nVersionNo;
int ncAllCodeWord;
int ncDataCodeWord[4];
int ncAlignPoint;
int nAlignPoint[6];
RS_BLOCKINFO RS_BlockInfo1[4];
RS_BLOCKINFO RS_BlockInfo2[4];
} QR_VERSIONINFO, *LPQR_VERSIONINFO;
/////////////////////////////////////////////////////////////////////////////
class CQR_Encode
{
public:
CQR_Encode();
~CQR_Encode();
public:
int m_nLevel;
int m_nVersion;
bool m_bAutoExtent;
int m_nMaskingNo;
public:
int m_nSymbleSize;
unsigned char m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE]; // [x][y]
private:
int m_ncDataCodeWordBit;
unsigned char m_byDataCodeWord[MAX_DATACODEWORD];
int m_ncDataBlock;
unsigned char m_byBlockMode[MAX_DATACODEWORD];
int m_nBlockLength[MAX_DATACODEWORD];
int m_ncAllCodeWord;
unsigned char m_byAllCodeWord[MAX_ALLCODEWORD];
unsigned char m_byRSWork[MAX_CODEBLOCK];
public:
bool EncodeData(int nLevel, int nVersion, bool bAutoExtent, int nMaskingNo, char* lpsSource, int ncSource = 0);
private:
int GetEncodeVersion(int nVersion, char* lpsSource, int ncLength);
bool EncodeSourceData(char* lpsSource, int ncLength, int nVerGroup);
int GetBitLength(unsigned char nMode, int ncData, int nVerGroup);
int SetBitStream(int nIndex, unsigned short wData, int ncData);
bool IsNumeralData(unsigned char c);
bool IsAlphabetData(unsigned char c);
bool IsKanjiData(unsigned char c1, unsigned char c2);
unsigned char AlphabetToBinaly(unsigned char c);
unsigned short KanjiToBinaly(unsigned short wc);
void GetRSCodeWord(unsigned char * lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord);
private:
void FormatModule();
void SetFunctionModule();
void SetFinderPattern(int x, int y);
void SetAlignmentPattern(int x, int y);
void SetVersionPattern();
void SetCodeWordPattern();
void SetMaskingPattern(int nPatternNo);
void SetFormatInfoPattern(int nPatternNo);
int CountPenalty();
};
/////////////////////////////////////////////////////////////////////////////
#endif // !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment