From 97ed12277ed5281a78036eccf9399a33b062c0db Mon Sep 17 00:00:00 2001 From: EddyGlezz Date: Sun, 28 Aug 2022 11:53:52 +0200 Subject: [PATCH] added the QT image provider as a library --- {qrGen => QrGen}/CMakeLists.txt | 33 ++++++++------- QrGen/Config.cmake.in | 3 ++ QrGen/README.md | 14 +++++++ {qrGen => QrGen}/include/qrcodegen.hpp | 0 {qrGen => QrGen}/src/qrcodegen.cpp | 1 + {qrGen => QrGen}/src/utils.cpp | 0 QtQrGen/CMakeLists.txt | 58 ++++++++++++++++++++++++++ QtQrGen/Config.cmake.in | 3 ++ QtQrGen/Qrimageprovider.cpp | 30 +++++++++++++ QtQrGen/README.md | 43 +++++++++++++++++++ QtQrGen/include/Qrimageprovider.hpp | 22 ++++++++++ qrGen/Config.cmake.in | 3 -- 12 files changed, 191 insertions(+), 19 deletions(-) rename {qrGen => QrGen}/CMakeLists.txt (54%) create mode 100644 QrGen/Config.cmake.in create mode 100644 QrGen/README.md rename {qrGen => QrGen}/include/qrcodegen.hpp (100%) rename {qrGen => QrGen}/src/qrcodegen.cpp (99%) rename {qrGen => QrGen}/src/utils.cpp (100%) create mode 100644 QtQrGen/CMakeLists.txt create mode 100644 QtQrGen/Config.cmake.in create mode 100644 QtQrGen/Qrimageprovider.cpp create mode 100644 QtQrGen/README.md create mode 100644 QtQrGen/include/Qrimageprovider.hpp delete mode 100644 qrGen/Config.cmake.in diff --git a/qrGen/CMakeLists.txt b/QrGen/CMakeLists.txt similarity index 54% rename from qrGen/CMakeLists.txt rename to QrGen/CMakeLists.txt index e453ed8..4bb7af4 100755 --- a/qrGen/CMakeLists.txt +++ b/QrGen/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.11 FATAL_ERROR) -#project(qrCode VERSION 0.1 DESCRIPTION "library for qr codes" LANGUAGES CXX) +project(QrCodeGenLib VERSION 0.1 DESCRIPTION "library for qr codes generation" LANGUAGES CXX) set(default_build_type "Release") @@ -17,42 +17,43 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_EXTENSIONS OFF) -add_library(qrGen src/qrcodegen.cpp src/utils.cpp include/qrcodegen.hpp) +add_library(QrGen src/qrcodegen.cpp src/utils.cpp include/qrcodegen.hpp) +set_target_properties(QrGen PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_compile_features(qrGen PUBLIC cxx_std_11) +target_compile_features(QrGen PUBLIC cxx_std_11) -target_include_directories(qrGen PUBLIC $ +target_include_directories(QrGen PUBLIC $ "$") -install(TARGETS qrGen EXPORT qrGenTargets DESTINATION lib) +install(TARGETS QrGen EXPORT QrGenTargets DESTINATION lib) install(DIRECTORY include/ DESTINATION include/) -install(EXPORT qrGenTargets - FILE qrGenTargets.cmake +install(EXPORT QrGenTargets + FILE QrGenTargets.cmake NAMESPACE qr:: - DESTINATION lib/cmake/qrGen + DESTINATION lib/cmake/QrGen ) include(CMakePackageConfigHelpers) # generate the config file that is includes the exports configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/qrGenConfig.cmake" - INSTALL_DESTINATION "lib/cmake/qrGen" + "${CMAKE_CURRENT_BINARY_DIR}/QrGenConfig.cmake" + INSTALL_DESTINATION "lib/cmake/QrGen" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO ) write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/qrGenConfigVersion.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/QrGenConfigVersion.cmake" VERSION "0.1.1.0" COMPATIBILITY AnyNewerVersion ) install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/qrGenConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/qrGenConfigVersion.cmake - DESTINATION lib/cmake/qrGen + ${CMAKE_CURRENT_BINARY_DIR}/QrGenConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/QrGenConfigVersion.cmake + DESTINATION lib/cmake/QrGen ) -export(EXPORT qrGenTargets - FILE "${CMAKE_CURRENT_BINARY_DIR}/qrGenTargets.cmake" +export(EXPORT QrGenTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/QrGenTargets.cmake" ) diff --git a/QrGen/Config.cmake.in b/QrGen/Config.cmake.in new file mode 100644 index 0000000..c809abb --- /dev/null +++ b/QrGen/Config.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include ( "${CMAKE_CURRENT_LIST_DIR}/QrGenTargets.cmake" ) diff --git a/QrGen/README.md b/QrGen/README.md new file mode 100644 index 0000000..304c388 --- /dev/null +++ b/QrGen/README.md @@ -0,0 +1,14 @@ +# QrGen + +The code is based on [QR Code generator library](https://github.com/nayuki/QR-Code-generator) and produce a library for the generation of a QR code of certain data. +CMake produce the target 'QrGen' so one can link to this library like +``` +target_link_libraries( QrGen) +``` + + + + + + + diff --git a/qrGen/include/qrcodegen.hpp b/QrGen/include/qrcodegen.hpp similarity index 100% rename from qrGen/include/qrcodegen.hpp rename to QrGen/include/qrcodegen.hpp diff --git a/qrGen/src/qrcodegen.cpp b/QrGen/src/qrcodegen.cpp similarity index 99% rename from qrGen/src/qrcodegen.cpp rename to QrGen/src/qrcodegen.cpp index 0957b79..db0acdc 100644 --- a/qrGen/src/qrcodegen.cpp +++ b/QrGen/src/qrcodegen.cpp @@ -245,6 +245,7 @@ int QrCode::getFormatBits(Ecc ecl) { QrCode QrCode::encodeText(const char *text, Ecc ecl) { + vector segs = QrSegment::makeSegments(text); return encodeSegments(segs, ecl); } diff --git a/qrGen/src/utils.cpp b/QrGen/src/utils.cpp similarity index 100% rename from qrGen/src/utils.cpp rename to QrGen/src/utils.cpp diff --git a/QtQrGen/CMakeLists.txt b/QtQrGen/CMakeLists.txt new file mode 100644 index 0000000..2506424 --- /dev/null +++ b/QtQrGen/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.16) +project(qmlqr LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) +include(local_conf.cmake OPTIONAL) + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick Core5Compat Svg) + +qt_add_library(QtQrGen Qrimageprovider.cpp include/Qrimageprovider.hpp) + +set_target_properties(QtQrGen PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) +target_include_directories(QtQrGen PUBLIC $ + "$") +target_link_libraries(QtQrGen PUBLIC + Qt6::Quick +) +target_link_libraries(QtQrGen PRIVATE + QrGen + Qt6::Core + Qt6::Gui + Qt6::Qml + Qt6::Quick + Qt6::Core5Compat + Qt6::Svg +) + +install(TARGETS QtQrGen EXPORT QtQrGenTargets LIBRARY DESTINATION lib) +install(DIRECTORY include/ DESTINATION include/) + +install(EXPORT QtQrGenTargets + FILE QtQrGenTargets.cmake + NAMESPACE qr:: + DESTINATION lib/cmake/QtQrGen + ) +include(CMakePackageConfigHelpers) +# generate the config file that is includes the exports +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/QtQrGenConfig.cmake" + INSTALL_DESTINATION "lib/cmake/QtQrGen" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/QtQrGenConfigVersion.cmake" + VERSION "0.1.1.0" + COMPATIBILITY AnyNewerVersion + ) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/QtQrGenConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/QtQrGenConfigVersion.cmake + DESTINATION lib/cmake/QtQrGen + ) +export(EXPORT QtQrGenTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/QtQrGenTargets.cmake" + ) diff --git a/QtQrGen/Config.cmake.in b/QtQrGen/Config.cmake.in new file mode 100644 index 0000000..22c2283 --- /dev/null +++ b/QtQrGen/Config.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include ( "${CMAKE_CURRENT_LIST_DIR}/QtQrGenTargets.cmake" ) diff --git a/QtQrGen/Qrimageprovider.cpp b/QtQrGen/Qrimageprovider.cpp new file mode 100644 index 0000000..c94541f --- /dev/null +++ b/QtQrGen/Qrimageprovider.cpp @@ -0,0 +1,30 @@ +#include +#include +#include +#include "qrcodegen.hpp" +#include "Qrimageprovider.hpp" +#include +using namespace qrcodegen; + +QPixmap QRImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) +{ + const int width = 100; + + const auto max=(requestedSize.width()>requestedSize.height())?requestedSize.width():requestedSize.height(); + + QPixmap pixmap(max > 0 ? max : width, + max> 0 ? max : width); + + *size = pixmap.size(); + const QrCode qr = QrCode::encodeText(id.toStdString().c_str(), static_cast(errC)); + const auto qrSVGstr=toSvgString(qr, color.name().toStdString()); + + auto qrImage=QSvgRenderer(QByteArray::fromStdString(qrSVGstr)); + QPainter Painter; + + Painter.begin(&pixmap); + qrImage.render(&Painter); + Painter.end(); + return pixmap; +} + diff --git a/QtQrGen/README.md b/QtQrGen/README.md new file mode 100644 index 0000000..59044e7 --- /dev/null +++ b/QtQrGen/README.md @@ -0,0 +1,43 @@ +#QtQrGen + +This code produce a library with a custom ImageProvider of Qt. The image provider print a QRCODE from a string. +CMake produce the target 'QtQrGen' so one can link to this library like +``` +target_link_libraries( QtQrGen) +``` + + +## Showing the QRCODE on QML aplications will be simple as + +``` +Image { + sourceSize.width: 300 + source: "image://qrcode/https://eddytheco.github.io/" + } +``` + +For this to work one has to add the custom ImageProvider to the QML engine like in the following main.cpp +``` +#include +#include +#include "Qrimageprovider.hpp" + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.addImageProvider(QLatin1String("qrCode"), new QRImageProvider("blue",1)); + const QUrl url(u"qrc:/app/main.qml"_qs); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +} +``` + + diff --git a/QtQrGen/include/Qrimageprovider.hpp b/QtQrGen/include/Qrimageprovider.hpp new file mode 100644 index 0000000..c3b1b81 --- /dev/null +++ b/QtQrGen/include/Qrimageprovider.hpp @@ -0,0 +1,22 @@ +#include + + + + +class QRImageProvider : public QQuickImageProvider +{ +public: + QRImageProvider(QColor col="black",int erc=0) + : QQuickImageProvider(QQuickImageProvider::Pixmap),color(col),errC(erc) + { + + } + + QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override; +private: + const QColor color; + const int errC; +}; + + + diff --git a/qrGen/Config.cmake.in b/qrGen/Config.cmake.in deleted file mode 100644 index e2eec00..0000000 --- a/qrGen/Config.cmake.in +++ /dev/null @@ -1,3 +0,0 @@ -@PACKAGE_INIT@ - -include ( "${CMAKE_CURRENT_LIST_DIR}/qrGenTargets.cmake" )