diff --git a/.github/workflows/build-test-install.yml b/.github/workflows/build-test-install.yml index 654b563..40ee046 100644 --- a/.github/workflows/build-test-install.yml +++ b/.github/workflows/build-test-install.yml @@ -13,23 +13,15 @@ jobs: matrix: os: [ubuntu-latest,macos-latest,windows-latest] - uses: EddyTheCo/Common/.github/workflows/build-test-install.yml@v0.3.0 + uses: EddyTheCo/Common/.github/workflows/build-test-install.yml@ndk26 with: os: ${{ matrix.os }} - qtVersion: '6.6.0' - cmakeArgs: "-DQTDEPLOY=ON -DBUILD_EXAMPLES=ON -DCPACK_PACKAGE_CONTACT=estervtech@gmail.com -DREPO_URL=https://eddytheco.github.io/qrCode -DCPACK_PACKAGE_VENDOR=estervtech" + qtVersion: '6.7.0' qtModules: 'qtshadertools qtmultimedia' - test: false - build_doxygen: - if: startsWith(github.ref, 'refs/tags/v') - uses: EddyTheCo/Common/.github/workflows/build-docs.yml@v0.3.0 - with: - cmakeArgs: "-DBUILD_QRDEC=OFF -DBUILD_QRGEN=OFF" - release: if: startsWith(github.ref, 'refs/tags/v') - needs: [build_test_package, build_doxygen] + needs: build_test_package runs-on: ubuntu-latest permissions: @@ -48,13 +40,11 @@ jobs: - uses: actions/download-artifact@v4 with: path: artifacts - - name: Display structure of downloaded files - run: ls -R - name: Move repositories to webpage run: | - mv artifacts/docs/html github-pages - rm -rf artifacts/docs + mv artifacts/common/html github-pages + mv artifacts/common . mkdir github-pages/packages/ ${{runner.temp}}/platforms/ mv artifacts/*/_CPack_Packages/* ${{runner.temp}}/platforms/ for i in ${{runner.temp}}/platforms/*; do mv $i/IFW/*/repository/* $i/; rm -rf $i/IFW $i/TGZ; done; @@ -68,13 +58,14 @@ jobs: cmake -E tar c ${{runner.temp}}/page-packages/github-pages.tar -- . - name: Releases - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: - files: ./artifacts/*/* + files: ./artifacts/*/* + body_path: ./common/CHANGELOG.md - uses: actions/upload-artifact@v4 with: - name: 'github-pages' + name: 'github-pages' path: ${{runner.temp}}/page-packages/* - name: Deploy to GitHub Pages diff --git a/.github/workflows/codeFormat.yml b/.github/workflows/codeFormat.yml new file mode 100644 index 0000000..2db2296 --- /dev/null +++ b/.github/workflows/codeFormat.yml @@ -0,0 +1,16 @@ +name: codeFormat +run-name: Format code and do PR +on: + pull_request_target: + types: [closed] + branches: [develop] +jobs: + checkout-format-pr: + runs-on: ubuntu-latest + if: ${{ (github.event.pull_request.merged == true) && (startsWith(github.base_ref, 'develop')) }} + permissions: + contents: write + pull-requests: write + + uses: EddyTheCo/Common/.github/workflows/codeFormat.yml@ndk26 + diff --git a/.github/workflows/qmllint.yml b/.github/workflows/qmllint.yml new file mode 100644 index 0000000..af0482e --- /dev/null +++ b/.github/workflows/qmllint.yml @@ -0,0 +1,35 @@ +name: qmllintbot +run-name: Linting QML for PR +on: + + workflow_run: + workflows: [push-build-release] + types: + - completed +jobs: + download-comment: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + permissions: + actions: read + pull-requests: write + steps: + - name: 'Download artifact' + uses: actions/download-artifact@v4 + with: + name: common + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Read pr number + id: getprn + run: | + cat pr_number + echo "prn=$(cat pr_number)" >> $GITHUB_OUTPUT + + - name: 'Run reviewer' + uses: EddyTheCo/qmllint-action/@v0.1.0 + with: + jsondir: ${{ github.workspace }} + pr_number: ${{ steps.getprn.outputs.prn }} + diff --git a/.gitignore b/.gitignore index 5b73495..04766dc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,7 @@ doc/html/ doc/*.tag *.swp +CMakeLists.txt.user +build* +tags +CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index c3fa486..b5c0f0c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,20 +1,23 @@ cmake_minimum_required(VERSION 3.24) + option(BUILD_QRDEC "Build Decoding part" ON) option(BUILD_QRENC "Build Encoding part" ON) +option(OpenCV_DOWNLOAD "Download prebuilts if find_package fails" ON) + include(${CMAKE_CURRENT_BINARY_DIR}/local_conf.cmake OPTIONAL) include(FetchContent) FetchContent_Declare( ccommon GIT_REPOSITORY https://github.com/EddyTheCo/Common.git - GIT_TAG v0.3.0 + GIT_TAG ndk26 ) FetchContent_MakeAvailable(ccommon) version_from_git( LOG OFF TIMESTAMP "%Y%m%d%H%M%S" ) -project(qrCode VERSION ${VERSION} DESCRIPTION "library for qr code manipulation" LANGUAGES CXX) +project(EstervQrCode VERSION ${VERSION} DESCRIPTION "Library for qr code manipulation" LANGUAGES CXX) set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_CXX_STANDARD 17) @@ -30,6 +33,7 @@ endif(BUILD_QRDEC) if(BUILD_QRENC) add_subdirectory(QrGen) endif(BUILD_QRENC) + add_subdirectory(QtQrDec) add_subdirectory(QtQrGen) @@ -41,4 +45,4 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) endif(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) if(BUILD_DOCS) build_docs() -endif() +endif(BUILD_DOCS) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..d83b31b --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,154 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "default-release", + "displayName": "Default Release", + "description": "Release Static library using Ninja generator", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build/release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "REPO_URL":"https://eddytheco.github.io/Esterv.Utils.QrCode" + } + }, + { + "name": "default-develop", + "displayName": "Default Config for development(Release)", + "description": "Release build type using Ninja generator, add tests and docs", + "inherits": "default-release", + "cacheVariables": { + "BUILD_DOCS":"ON", + "BUILD_EXAMPLES": "ON", + "QTDEPLOY":"ON" + } + }, + { + "name": "default-develop-debug", + "displayName": "Default Config for development(Debug)", + "description": "Debug build type using Ninja generator", + "inherits": "default-develop", + "binaryDir": "${sourceDir}/build/debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + } + ], + "buildPresets": [ + { + "name": "default-release", + "configurePreset": "default-release" + }, + { + "name": "default-develop", + "configurePreset": "default-develop" + }, + { + "name": "default-develop-debug", + "configurePreset": "default-develop-debug" + }, + { + "name": "default-documentation", + "configurePreset": "default-develop", + "targets":"doxygen_docs" + }, + { + "name": "default-qmllint", + "configurePreset": "default-develop", + "targets":"all_qmllint_json" + } + ], + "workflowPresets": [ + { + "name": "default-release", + "steps": [ + { + "type": "configure", + "name": "default-release" + }, + { + "type": "build", + "name": "default-release" + } + ] + }, + { + "name": "default-develop", + "steps": [ + { + "type": "configure", + "name": "default-develop" + }, + { + "type": "build", + "name": "default-develop" + } + ] + }, + { + "name": "default-documentation", + "steps": [ + { + "type": "configure", + "name": "default-develop" + }, + { + "type": "build", + "name": "default-documentation" + } + ] + }, + { + "name": "default-qmllint", + "steps": [ + { + "type": "configure", + "name": "default-develop" + }, + { + "type": "build", + "name": "default-qmllint" + } + ] + }, + { + "name": "default-develop-debug", + "steps": [ + { + "type": "configure", + "name": "default-develop-debug" + }, + { + "type": "build", + "name": "default-develop-debug" + } + ] + } + ], + "packagePresets": [ + { + "name": "default-release", + "description": "Release runtime components", + "configurePreset": "default-release", + "generators": [ + "IFW","TGZ" + ], + "variables": { + "CPACK_COMPONENTS_ALL": "EstervQrGen;EstervQtQrGen;EstervQrDec;EstervQtQrDec;EstervQtQrGen-qml;EstervQtQrDec-qml", + "CPACK_PACKAGE_CONTACT":"estervtech@gmail.com", + "CPACK_PACKAGE_VENDOR":"estervtech" + }, + "packageDirectory": "packages" + }, + { + "name": "default-develop", + "description": "Release development components", + "inherits":"default-release", + "configurePreset": "default-develop", + "variables": { + "CPACK_COMPONENTS_ALL": "EstervQrGen;EstervQrGen-dev;EstervQrDec;EstervQrDec-dev;EstervQtQrGen;EstervQtQrGen-dev;EstervQtQrDec;EstervQtQrDec-dev;EstervQtQrGen-qml;EstervQtQrDec-qml; EstervQrCode-examples" + } + } + ] + +} diff --git a/Config.cmake.in b/Config.cmake.in index df85b34..5ba963f 100644 --- a/Config.cmake.in +++ b/Config.cmake.in @@ -1,6 +1,6 @@ @PACKAGE_INIT@ include(CMakeFindDependencyMacro) -find_dependency(Qt6 REQUIRED COMPONENTS Core Gui Qml Quick Svg OPTIONAL_COMPONENTS Multimedia ) +find_dependency(Qt6 COMPONENTS Core Gui Qml Quick Svg OPTIONAL_COMPONENTS Multimedia ) find_dependency(OpenCV COMPONENTS core objdetect imgproc flann features2d calib3d ) find_dependency(EstervDesigns 1.2 COMPONENTS SimpleStyle CustomControls CONFIG) -include ( "${CMAKE_CURRENT_LIST_DIR}/qrCode-config.cmake" ) +include ( "${CMAKE_CURRENT_LIST_DIR}/EstervQrCode-config.cmake" ) diff --git a/QrDec/CMakeLists.txt b/QrDec/CMakeLists.txt index 061ab77..e891470 100755 --- a/QrDec/CMakeLists.txt +++ b/QrDec/CMakeLists.txt @@ -1,6 +1,5 @@ -find_package(OpenCV COMPONENTS core objdetect imgproc flann features2d calib3d ) +find_package(OpenCV COMPONENTS core objdetect imgproc flann features2d calib3d) -option(OpenCV_DOWNLOAD "On or off" ON) if(NOT OpenCV_FOUND AND OpenCV_DOWNLOAD) set(builturl "https://github.com/EddyTheCo/install-OpenCV-action/releases/latest/download/OpenCV-ubuntu-latest-wasm_false-android_none.tar") if(WIN32) @@ -37,8 +36,8 @@ if(NOT OpenCV_FOUND AND OpenCV_DOWNLOAD) if(OpenCV_FOUND AND NOT ANDROID AND NOT EMSCRIPTEN) install(IMPORTED_RUNTIME_ARTIFACTS ${OpenCV_LIBS} DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT OpenCVDep - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT OpenCVDep + COMPONENT OpenCV-dep + RUNTIME COMPONENT OpenCV-dep ) endif() endif() @@ -46,25 +45,24 @@ endif() if(OpenCV_FOUND) - add_library(QrDec qrcodedec.cpp) + add_library(QrDec src/qrcode_dec.cpp) - add_library(${PROJECT_NAME}::QrDec ALIAS QrDec) + add_library(Esterv::QrDec ALIAS QrDec) set_target_properties(QrDec PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) target_include_directories(QrDec PUBLIC $) target_link_libraries(QrDec PUBLIC ${OpenCV_LIBS}) target_include_directories(QrDec PUBLIC $ - "$") + "$") install(TARGETS QrDec EXPORT ${PROJECT_NAME}-config - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT QrDec - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QrDec - ) - install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Esterv - COMPONENT ${PROJECT_NAME} + COMPONENT EstervQrDec + ARCHIVE COMPONENT ${PROJECT_NAME}-dev ) + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${PROJECT_NAME}-dev) else() message(STATUS "The QRCODE decoding library will not be built") endif(OpenCV_FOUND) diff --git a/QrDec/README.md b/QrDec/README.md index 1d91ca7..43a8dec 100644 --- a/QrDec/README.md +++ b/QrDec/README.md @@ -1,4 +1,4 @@ -# QrDec +# Esterv.Utils.QrDec [TOC] @@ -7,17 +7,18 @@ The detection and decoding is performed by [OpenCV](https://opencv.org/) librari In case OpenCV is not found on your system CMake will download pre compiled libraries from [my action releases](https://github.com/EddyTheCo/install-OpenCV-action). ## Adding the libraries to your CMake project + ``` include(FetchContent) FetchContent_Declare( - qrCode - GIT_REPOSITORY https://github.com/EddyTheCo/qrCode.git + EstervQrCode + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Utils.QrCode.git GIT_TAG vMAJOR.MINOR.PATCH - FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS QrDec CONFIG + FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS EstervQrDec EstervQrDec-dev CONFIG ) -FetchContent_MakeAvailable(qrCode) +FetchContent_MakeAvailable(EstervQrCode) -target_link_libraries( qrCode::QrDec) +target_link_libraries( Esterv::QrDec) ``` @@ -26,3 +27,4 @@ target_link_libraries( qrCode::QrDec) + diff --git a/QrDec/include/qrcodedec.hpp b/QrDec/include/esterv/utils/qrcode_dec.hpp similarity index 85% rename from QrDec/include/qrcodedec.hpp rename to QrDec/include/esterv/utils/qrcode_dec.hpp index b775d24..c6e87b0 100644 --- a/QrDec/include/qrcodedec.hpp +++ b/QrDec/include/esterv/utils/qrcode_dec.hpp @@ -2,6 +2,8 @@ #include #include +namespace Esterv::Utils::QrDec +{ class QRDecoder : public cv::QRCodeDetectorAruco { @@ -9,4 +11,4 @@ class QRDecoder : public cv::QRCodeDetectorAruco QRDecoder(){}; std::string decode_grey(unsigned char* img, int rows,int cols); }; - +} diff --git a/QrDec/qrcodedec.cpp b/QrDec/src/qrcode_dec.cpp similarity index 80% rename from QrDec/qrcodedec.cpp rename to QrDec/src/qrcode_dec.cpp index dc0d16b..d0839e9 100644 --- a/QrDec/qrcodedec.cpp +++ b/QrDec/src/qrcode_dec.cpp @@ -1,4 +1,6 @@ -#include +#include + +namespace Esterv::Utils::QrDec{ std::string QRDecoder::decode_grey(unsigned char* img,int rows ,int cols) { @@ -11,5 +13,4 @@ std::string QRDecoder::decode_grey(unsigned char* img,int rows ,int cols) return detectAndDecode(greyImg); } - - +} diff --git a/QrGen/CMakeLists.txt b/QrGen/CMakeLists.txt index 172c5bb..c5b4c50 100755 --- a/QrGen/CMakeLists.txt +++ b/QrGen/CMakeLists.txt @@ -1,21 +1,19 @@ -add_library(QrGen src/qrcodegen.cpp src/utils.cpp) -add_library(${PROJECT_NAME}::QrGen ALIAS QrGen) +add_library(QrGen src/qrcode_gen.cpp src/utils.cpp) +add_library(Esterv::QrGen ALIAS QrGen) set_target_properties(QrGen PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(QrGen PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) target_include_directories(QrGen PUBLIC $ - "$") + "$") install(TARGETS QrGen EXPORT ${PROJECT_NAME}-config - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT QrGen - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QrGen + COMPONENT EstervQrGen + ARCHIVE COMPONENT ${PROJECT_NAME}-dev ) -install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Esterv - COMPONENT ${PROJECT_NAME} - ) - +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${PROJECT_NAME}-dev) diff --git a/QrGen/README.md b/QrGen/README.md index 4844de8..7c282e7 100644 --- a/QrGen/README.md +++ b/QrGen/README.md @@ -1,21 +1,22 @@ -# QrGen +# Esterv.Utils.QrGen [TOC] 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. -## Adding the libraries to your CMake project +## Adding the libraries to your CMake project + ``` include(FetchContent) FetchContent_Declare( - qrCode - GIT_REPOSITORY https://github.com/EddyTheCo/qrCode.git + EstervQrCode + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Utils.QrCode.git GIT_TAG vMAJOR.MINOR.PATCH - FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS QrGen CONFIG + FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS EstervQrGen EstervQrGen-dev CONFIG ) -FetchContent_MakeAvailable(qrCode) +FetchContent_MakeAvailable(EstervQrCode) -target_link_libraries( qrCode::QrGen) +target_link_libraries( Esterv::QrGen) ``` diff --git a/QrGen/include/qrcodegen.hpp b/QrGen/include/esterv/utils/qrcode_gen.hpp similarity index 99% rename from QrGen/include/qrcodegen.hpp rename to QrGen/include/esterv/utils/qrcode_gen.hpp index 55e5c05..6715e8c 100644 --- a/QrGen/include/qrcodegen.hpp +++ b/QrGen/include/esterv/utils/qrcode_gen.hpp @@ -31,7 +31,7 @@ #include #include -namespace qrcodegen { +namespace Esterv::Utils::QrGen { /* * A segment of character/binary/control data in a QR Code symbol. diff --git a/QrGen/src/qrcodegen.cpp b/QrGen/src/qrcode_gen.cpp similarity index 99% rename from QrGen/src/qrcodegen.cpp rename to QrGen/src/qrcode_gen.cpp index db0acdc..e29be3c 100644 --- a/QrGen/src/qrcodegen.cpp +++ b/QrGen/src/qrcode_gen.cpp @@ -29,7 +29,7 @@ #include #include #include -#include "qrcodegen.hpp" +#include "esterv/utils/qrcode_gen.hpp" using std::int8_t; using std::uint8_t; @@ -37,7 +37,7 @@ using std::size_t; using std::vector; -namespace qrcodegen { +namespace Esterv::Utils::QrGen { /*---- Class QrSegment ----*/ diff --git a/QrGen/src/utils.cpp b/QrGen/src/utils.cpp index 4cb5957..2432f8c 100644 --- a/QrGen/src/utils.cpp +++ b/QrGen/src/utils.cpp @@ -1,5 +1,6 @@ -#include "qrcodegen.hpp" -namespace qrcodegen { +#include "esterv/utils/qrcode_gen.hpp" +namespace Esterv::Utils::QrGen { + std::string toSvgString(const QrCode &qr, std::string fill) { diff --git a/QtQrDec/CMakeLists.txt b/QtQrDec/CMakeLists.txt index 64d6397..786c700 100644 --- a/QtQrDec/CMakeLists.txt +++ b/QtQrDec/CMakeLists.txt @@ -10,16 +10,16 @@ endif(EMSCRIPTEN) if (Qt6_FOUND AND TARGET QrDec) FetchContent_Declare( EstervDesigns - GIT_REPOSITORY https://github.com/EddyTheCo/MyDesigns.git + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Designs.git GIT_TAG develop - FIND_PACKAGE_ARGS 1.2 COMPONENTS SimpleStyle CustomControls CONFIG + FIND_PACKAGE_ARGS 1.2 COMPONENTS EstervSimpleStyle EstervSimpleStyle-dev EstervCustomControls EstervCustomControls-dev CONFIG ) FetchContent_MakeAvailable(EstervDesigns) qt_standard_project_setup() qt6_add_qml_module(QtQrDec URI Esterv.CustomControls.QrDec VERSION 1.0 - SOURCES Qrimagedecoder.cpp include/Qrimagedecoder.hpp + SOURCES src/qr_image_decoder.cpp include/esterv/utils/qr_image_decoder.hpp QML_FILES "qml/QrCam.qml" "qml/QrDecPop.qml" @@ -32,9 +32,18 @@ if (Qt6_FOUND AND TARGET QrDec) IMPORT_PATH ${CMAKE_BINARY_DIR} ) - add_library(${PROJECT_NAME}::QtQrDec ALIAS QtQrDec) - add_library(${PROJECT_NAME}::QtQrDecplugin ALIAS QtQrDecplugin) - target_compile_definitions(QtQrDec PRIVATE WINDOWS_DEC) + add_library(Esterv::QtQrDec ALIAS QtQrDec) + add_library(Esterv::QtQrDecplugin ALIAS QtQrDecplugin) + target_compile_definitions( + QtQrDec + PUBLIC + $,$,SHARED_LIBRARY>>,QTQRDEC_SHARED,> + ) + target_compile_definitions( + QtQrDec + PRIVATE + WINDOWS_EXPORT + ) set_target_properties(QtQrDec PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) qt6_add_shaders(QtQrDec "esterVtech.com.imports.QtQrDec.shaders" @@ -48,37 +57,36 @@ if (Qt6_FOUND AND TARGET QrDec) "frag/qrscanner.frag" ) target_include_directories(QtQrDec PUBLIC $ - "$") + "$") + target_include_directories(QtQrDec PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/esterv/utils) if(EMSCRIPTEN) target_compile_definitions(QtQrDec PRIVATE USE_EMSCRIPTEN) else() target_link_libraries(QtQrDec PUBLIC Qt6::Multimedia) endif(EMSCRIPTEN) target_link_libraries(QtQrDec PUBLIC Qt6::Gui Qt6::Quick QrDec - EstervDesigns::SimpleStyle EstervDesigns::CustomControls - $<$,STATIC_LIBRARY>:EstervDesigns::SimpleStyleplugin> - $<$,STATIC_LIBRARY>:EstervDesigns::CustomControlsplugin>) + Esterv::SimpleStyle Esterv::CustomControls + $<$,STATIC_LIBRARY>:Esterv::SimpleStyleplugin> + $<$,STATIC_LIBRARY>:Esterv::CustomControlsplugin>) install(TARGETS QtQrDec ${out_targets_var} ${out_targets_var2} EXPORT ${PROJECT_NAME}-config - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT QtQrDec - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QtQrDec - ) - install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Esterv - COMPONENT QtQrDec + COMPONENT EstervQtQrDec ) + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${PROJECT_NAME}-dev) install(DIRECTORY ${CMAKE_BINARY_DIR}/Esterv/CustomControls/QrDec DESTINATION ${CMAKE_INSTALL_LIBDIR}/Esterv/CustomControls - COMPONENT QtQrDec + COMPONENT EstervQtQrDec-qml ) install(TARGETS QtQrDecplugin EXPORT ${PROJECT_NAME}-config DESTINATION ${CMAKE_INSTALL_LIBDIR}/Esterv/CustomControls/QrDec - COMPONENT QtQrDec - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QtQrDec + COMPONENT EstervQtQrDec-qml + ARCHIVE COMPONENT ${PROJECT_NAME}-dev ) if(EMSCRIPTEN) @@ -88,5 +96,5 @@ if (Qt6_FOUND AND TARGET QrDec) add_subdirectory(examples) endif(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) else(Qt6_FOUND AND TARGET QrDec) - message(STATUS "The QML Module for QRCODE decoding will not be built") + message(STATUS "The QML Module/Qt methods for QRCODE decoding will not be built") endif(Qt6_FOUND AND TARGET QrDec) diff --git a/QtQrDec/README.md b/QtQrDec/README.md index 01dfb94..781e01f 100644 --- a/QtQrDec/README.md +++ b/QtQrDec/README.md @@ -1,10 +1,10 @@ -# QtQrDec +# Esterv.CustomControls.QrDec [TOC] This repo produce a QML Module with custom types that can detect and decode QRCODEs. -The types should be style independent, but the colors used relies on the [EstervDesigns](https://github.com/EddyTheCo/MyDesigns) +The types should be style independent, but the colors used relies on the [EstervDesigns](https://github.com/EddyTheCo/Esterv.Designs) Simple style. If you want to change the colors in your top qml file one can do ``` @@ -13,7 +13,7 @@ import Esterv.Styles.Simple Component.onCompleted: { -Style.frontColor1= (Style.theme)?LightThemeColor:DarkThemeColor//Like control.palette.text +Style.frontColor1= (Style.theme)?LightThemeColor:DarkThemeColor //Like control.palette.text Style.frontColor2= ... Style.frontColor3= ... @@ -34,17 +34,19 @@ You can play with the decoder on [this page](https://eddytheco.github.io/qmlonli ## Adding the module to your CMake project + ``` include(FetchContent) FetchContent_Declare( - qrCode - GIT_REPOSITORY https://github.com/EddyTheCo/qrCode.git + EstervQrCode + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Utils.QrCode.git GIT_TAG vMAJOR.MINOR.PATCH - FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS QtQrDec CONFIG + FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS EstervQtQrDec EstervQtQrDec-dev EstervQtQrDec-qml CONFIG ) -FetchContent_MakeAvailable(qrCode) +FetchContent_MakeAvailable(EstervQrCode) -target_link_libraries( qrCode::QtQrDec) +target_link_libraries( Esterv::QtQrDec) +target_link_libraries( $<$,STATIC_LIBRARY>:Esterv::QtQrDecplugin>) ``` diff --git a/QtQrDec/examples/CMakeLists.txt b/QtQrDec/examples/CMakeLists.txt index 69e0a21..a13b8e4 100644 --- a/QtQrDec/examples/CMakeLists.txt +++ b/QtQrDec/examples/CMakeLists.txt @@ -2,7 +2,7 @@ if(BUILD_EXAMPLES) include(InstallRequiredSystemLibraries) if(EMSCRIPTEN OR ANDROID) find_package(Qt6 REQUIRED COMPONENTS QuickControls2) - find_package(EstervDesigns 0.4 REQUIRED COMPONENTS FlatControl CONFIG ) + find_package(EstervDesigns 1.2 REQUIRED COMPONENTS EstervFlatControl CONFIG ) endif(EMSCRIPTEN OR ANDROID) foreach(example "qrcam" "qrtext" @@ -29,18 +29,21 @@ if(BUILD_EXAMPLES) WIN32_EXECUTABLE ON MACOSX_BUNDLE ON ) - install(TARGETS ${example} COMPONENT examples - BUNDLE DESTINATION . COMPONENT examples + install(TARGETS ${example} COMPONENT ${PROJECT_NAME}-examples + BUNDLE DESTINATION . COMPONENT ${PROJECT_NAME}-examples LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT examples + COMPONENT ${PROJECT_NAME}-examples ) if(QTDEPLOY) + if(WIN32) + set(deploy_tools_options -multimedia) + endif(WIN32) qt_generate_deploy_qml_app_script( TARGET ${example} OUTPUT_SCRIPT deploy_script - # DEPLOY_TOOL_OPTIONS -multimedia #Qt> 6.7.0 only for windows + DEPLOY_TOOL_OPTIONS ${deploy_tools_options} #Qt> 6.7.0 only for windows ) - install(SCRIPT ${deploy_script} COMPONENT examples) + install(SCRIPT ${deploy_script} COMPONENT ${PROJECT_NAME}-examples) endif(QTDEPLOY) if(ANDROID) set_property(TARGET ${example} APPEND PROPERTY QT_ANDROID_MIN_SDK_VERSION 30) @@ -61,8 +64,8 @@ if(BUILD_EXAMPLES) endif(ANDROID) if(EMSCRIPTEN OR ANDROID) - target_link_libraries(${example} PRIVATE EstervDesigns::FlatControl Qt6::QuickControls2 - $<$,STATIC_LIBRARY>:EstervDesigns::FlatControlplugin> + target_link_libraries(${example} PRIVATE Esterv::FlatControl Qt6::QuickControls2 + $<$,STATIC_LIBRARY>:Esterv::FlatControlplugin> ) target_compile_definitions(${example} PRIVATE FORCE_STYLE="Esterv.Controls.Flat") endif(EMSCRIPTEN OR ANDROID) diff --git a/QtQrDec/examples/qrcam.cpp b/QtQrDec/examples/qrcam.cpp index 505e8cf..060043a 100644 --- a/QtQrDec/examples/qrcam.cpp +++ b/QtQrDec/examples/qrcam.cpp @@ -1,10 +1,13 @@ #include #include -#include "Qrimagedecoder.hpp" +#include "esterv/utils/qr_image_decoder.hpp" #if defined(FORCE_STYLE) #include #endif + +using namespace Esterv::Utils::QrDec; + int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); diff --git a/QtQrDec/examples/qrtext.cpp b/QtQrDec/examples/qrtext.cpp index 08c613b..86c4eef 100644 --- a/QtQrDec/examples/qrtext.cpp +++ b/QtQrDec/examples/qrtext.cpp @@ -1,10 +1,13 @@ #include #include -#include "Qrimagedecoder.hpp" +#include "esterv/utils/qr_image_decoder.hpp" #if defined(FORCE_STYLE) #include #endif + +using namespace Esterv::Utils::QrDec; + int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); diff --git a/QtQrDec/include/Qrimagedecoder.hpp b/QtQrDec/include/esterv/utils/qr_image_decoder.hpp similarity index 88% rename from QtQrDec/include/Qrimagedecoder.hpp rename to QtQrDec/include/esterv/utils/qr_image_decoder.hpp index 58af70a..f7a8ab8 100644 --- a/QtQrDec/include/Qrimagedecoder.hpp +++ b/QtQrDec/include/esterv/utils/qr_image_decoder.hpp @@ -11,20 +11,24 @@ #include #include #include -#include #endif -#include +#include +#if defined(QTQRDEC_SHARED) #include -#if defined(WINDOWS_DEC) -# define DEC_EXPORT Q_DECL_EXPORT + #ifdef WINDOWS_EXPORT + #define DEC_EXPORT Q_DECL_EXPORT + #else + #define DEC_EXPORT Q_DECL_IMPORT + #endif #else -#define DEC_EXPORT Q_DECL_IMPORT + #define DEC_EXPORT #endif - +namespace Esterv::Utils::QrDec +{ class DEC_EXPORT QRImageDecoder : public QObject { Q_OBJECT @@ -85,4 +89,4 @@ class DEC_EXPORT WasmImageProvider : public QQuickImageProvider static void restart(void); static QImage img; }; - +} diff --git a/QtQrDec/Qrimagedecoder.cpp b/QtQrDec/src/qr_image_decoder.cpp similarity index 94% rename from QtQrDec/Qrimagedecoder.cpp rename to QtQrDec/src/qr_image_decoder.cpp index 3efcfb4..a964468 100644 --- a/QtQrDec/Qrimagedecoder.cpp +++ b/QtQrDec/src/qr_image_decoder.cpp @@ -1,11 +1,8 @@ -#include "Qrimagedecoder.hpp" -#include -#include -#include +#include "esterv/utils/qr_image_decoder.hpp" #include - - -QRImageDecoder* QRImageDecoder::m_instance=nullptr; +#include +#include +#include #ifdef USE_EMSCRIPTEN @@ -14,9 +11,13 @@ QRImageDecoder* QRImageDecoder::m_instance=nullptr; EMSCRIPTEN_BINDINGS(qrdecoder) { - emscripten::class_("QRImageDecoder") - .function("reload", &QRImageDecoder::reload,emscripten::allow_raw_pointers()) - .class_function("instance", &QRImageDecoder::instance, emscripten::allow_raw_pointers()); + emscripten::class_("QRImageDecoder") + .function("reload", + &Esterv::Utils::QrDec::QRImageDecoder::reload, + emscripten::allow_raw_pointers()) + .class_function("instance", + &Esterv::Utils::QrDec::QRImageDecoder::instance, + emscripten::allow_raw_pointers()); } EM_JS(void, js_start, (), { @@ -75,6 +76,9 @@ EM_JS(void, js_stop, (), { #include #endif +namespace Esterv::Utils::QrDec { +QRImageDecoder *QRImageDecoder::m_instance = nullptr; + void QRImageDecoder::getCamera(void) { const QList cameras = QMediaDevices::videoInputs(); @@ -232,4 +236,4 @@ void QRImageDecoder::setid() emit sourceChanged(); index++; } - +} diff --git a/QtQrGen/CMakeLists.txt b/QtQrGen/CMakeLists.txt index 5ccbc2e..f4f50b9 100644 --- a/QtQrGen/CMakeLists.txt +++ b/QtQrGen/CMakeLists.txt @@ -3,16 +3,16 @@ find_package(Qt6 COMPONENTS Core Gui Qml Quick OPTIONAL_COMPONENTS Svg) if (Qt6_FOUND AND TARGET QrGen) FetchContent_Declare( EstervDesigns - GIT_REPOSITORY https://github.com/EddyTheCo/MyDesigns.git + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Designs.git GIT_TAG develop - FIND_PACKAGE_ARGS 1.2 COMPONENTS SimpleStyle CustomControls CONFIG + FIND_PACKAGE_ARGS 1.2 COMPONENTS EstervSimpleStyle EstervSimpleStyle-dev EstervCustomControls EstervCustomControls-dev CONFIG ) FetchContent_MakeAvailable(EstervDesigns) qt_standard_project_setup() qt6_add_qml_module(QtQrGen URI Esterv.CustomControls.QrGen VERSION ${VERSION} - SOURCES Qrimageprovider.cpp include/Qrimageprovider.hpp + SOURCES src/qr_image_provider.cpp include/esterv/utils/qr_image_provider.hpp QML_FILES "qml/QrGenImage.qml" "qml/QrGenPop.qml" @@ -25,10 +25,19 @@ if (Qt6_FOUND AND TARGET QrGen) IMPORT_PATH ${CMAKE_BINARY_DIR} ) - add_library(${PROJECT_NAME}::QtQrGen ALIAS QtQrGen) - add_library(${PROJECT_NAME}::QtQrGenplugin ALIAS QtQrGenplugin) + add_library(Esterv::QtQrGen ALIAS QtQrGen) + add_library(Esterv::QtQrGenplugin ALIAS QtQrGenplugin) + target_compile_definitions( + QtQrGen + PUBLIC + $,$,SHARED_LIBRARY>>,QTQRGEN_SHARED,> + ) + target_compile_definitions( + QtQrGen + PRIVATE + WINDOWS_EXPORT + ) set_target_properties(QtQrGen PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) - target_compile_definitions(QtQrGen PRIVATE WINDOWS_GEN) qt6_add_shaders(QtQrGen "esterVtech.com.imports.QtQrGen.shaders" BATCHABLE @@ -43,11 +52,12 @@ if (Qt6_FOUND AND TARGET QrGen) target_include_directories(QtQrGen PUBLIC $ "$") + target_include_directories(QtQrGen PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/esterv/utils) if(NOT TARGET Qt6::Svg) FetchContent_Declare( qtsvg GIT_REPOSITORY https://github.com/qt/qtsvg.git - GIT_TAG 6.6.0 + GIT_TAG 6.7.0 ) FetchContent_MakeAvailable(qtsvg) endif() @@ -57,30 +67,29 @@ if (Qt6_FOUND AND TARGET QrGen) Qt6::Quick ) target_link_libraries(QtQrGen PRIVATE QrGen Qt6::Core Qt6::Gui Qt6::Qml Qt6::Svg - EstervDesigns::SimpleStyle EstervDesigns::CustomControls - $<$,STATIC_LIBRARY>:EstervDesigns::SimpleStyleplugin> - $<$,STATIC_LIBRARY>:EstervDesigns::CustomControlsplugin>) + Esterv::SimpleStyle Esterv::CustomControls + $<$,STATIC_LIBRARY>:Esterv::SimpleStyleplugin> + $<$,STATIC_LIBRARY>:Esterv::CustomControlsplugin>) install(TARGETS QtQrGen ${out_targets_var} ${out_targets_var2} EXPORT ${PROJECT_NAME}-config - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT QtQrGen - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QtQrGen + COMPONENT EstervQtQrGen + ARCHIVE COMPONENT ${PROJECT_NAME}-dev ) install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/include/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Esterv - COMPONENT QtQrGen + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${PROJECT_NAME}-dev ) install(DIRECTORY ${CMAKE_BINARY_DIR}/Esterv/CustomControls/QrGen DESTINATION ${CMAKE_INSTALL_LIBDIR}/Esterv/CustomControls - COMPONENT QtQrGen + COMPONENT EstervQtQrGen-qml ) install(TARGETS QtQrGenplugin EXPORT ${PROJECT_NAME}-config DESTINATION ${CMAKE_INSTALL_LIBDIR}/Esterv/CustomControls/QrGen - COMPONENT QtQrGen - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT QtQrGen + COMPONENT EstervQtQrGen-qml + ARCHIVE COMPONENT ${PROJECT_NAME}-dev ) if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) add_subdirectory(examples) diff --git a/QtQrGen/README.md b/QtQrGen/README.md index 658dbe3..dbc20c8 100644 --- a/QtQrGen/README.md +++ b/QtQrGen/README.md @@ -1,4 +1,4 @@ -# QtQrGen +# Esterv.CustomControls.QrGen [TOC] @@ -9,6 +9,7 @@ The custom types are related to the generation and showing of QRCODEs. The types should be style independent, but the colors used relies on the [EstervDesigns](https://github.com/EddyTheCo/MyDesigns) Simple style. If you want to change the colors in your top qml file one can do + ``` import Esterv.Styles.Simple ... @@ -31,18 +32,21 @@ You can play with the ImageProvider on [this page](https://eddytheco.github.io/ ## Adding the module to your CMake project + ``` include(FetchContent) FetchContent_Declare( - qrCode - GIT_REPOSITORY https://github.com/EddyTheCo/qrCode.git + EstervQrCode + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Utils.QrCode.git GIT_TAG vMAJOR.MINOR.PATCH - FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS QtQrGen CONFIG + FIND_PACKAGE_ARGS MAJOR.MINOR COMPONENTS EstervQtQrGen EstervQtQrGen-dev EstervQtQrGen-qml CONFIG ) -FetchContent_MakeAvailable(qrCode) +FetchContent_MakeAvailable(EstervQrCode) -target_link_libraries( qrCode::QtQrGen) +target_link_libraries( Esterv::QtQrGen) +target_link_libraries( $<$,STATIC_LIBRARY>:Esterv::QtQrGenplugin>) ``` + ## Examples The [examples](examples) folder shows the use of the different custom types provided by the QML module. diff --git a/QtQrGen/examples/CMakeLists.txt b/QtQrGen/examples/CMakeLists.txt index 8f63ed2..1244a2d 100644 --- a/QtQrGen/examples/CMakeLists.txt +++ b/QtQrGen/examples/CMakeLists.txt @@ -2,7 +2,7 @@ if(BUILD_EXAMPLES) include(InstallRequiredSystemLibraries) if(EMSCRIPTEN OR ANDROID) find_package(Qt6 REQUIRED COMPONENTS QuickControls2) - find_package(EstervDesigns 0.4 REQUIRED COMPONENTS FlatControl CONFIG ) + find_package(EstervDesigns 1.2 REQUIRED COMPONENTS EstervFlatControl EstervFlatControl-dev CONFIG ) endif(EMSCRIPTEN OR ANDROID) foreach(example "image" "text" @@ -26,8 +26,8 @@ if(BUILD_EXAMPLES) WIN32_EXECUTABLE ON MACOSX_BUNDLE ON ) - install(TARGETS ${example} COMPONENT examples - BUNDLE DESTINATION . COMPONENT examples + install(TARGETS ${example} COMPONENT ${PROJECT_NAME}-examples + BUNDLE DESTINATION . COMPONENT ${PROJECT_NAME}-examples LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if(QTDEPLOY) @@ -35,7 +35,7 @@ if(BUILD_EXAMPLES) TARGET ${example} OUTPUT_SCRIPT deploy_script ) - install(SCRIPT ${deploy_script} COMPONENT examples) + install(SCRIPT ${deploy_script} COMPONENT ${PROJECT_NAME}-examples) endif(QTDEPLOY) if(ANDROID) set_property(TARGET ${example} APPEND PROPERTY QT_ANDROID_MIN_SDK_VERSION 30) @@ -56,7 +56,7 @@ if(BUILD_EXAMPLES) endif(ANDROID) if(EMSCRIPTEN OR ANDROID) target_link_libraries(${example} PRIVATE EstervDesigns::FlatControl Qt6::QuickControls2 - $<$,STATIC_LIBRARY>:EstervDesigns::FlatControlplugin> + $<$,STATIC_LIBRARY>:Esterv::FlatControlplugin> ) target_compile_definitions(${example} PRIVATE FORCE_STYLE="Esterv.Controls.Flat") endif(EMSCRIPTEN OR ANDROID) diff --git a/QtQrGen/examples/image.cpp b/QtQrGen/examples/image.cpp index ac60319..6620465 100644 --- a/QtQrGen/examples/image.cpp +++ b/QtQrGen/examples/image.cpp @@ -1,9 +1,13 @@ #include #include -#include "Qrimageprovider.hpp" +#include "esterv/utils/qr_image_provider.hpp" + #if defined(FORCE_STYLE) #include #endif + +using namespace Esterv::Utils::QrGen; + int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); diff --git a/QtQrGen/examples/text.cpp b/QtQrGen/examples/text.cpp index 02dee2a..bff7b7c 100644 --- a/QtQrGen/examples/text.cpp +++ b/QtQrGen/examples/text.cpp @@ -1,9 +1,12 @@ #include #include -#include "Qrimageprovider.hpp" +#include "esterv/utils/qr_image_provider.hpp" #if defined(FORCE_STYLE) #include #endif + +using namespace Esterv::Utils::QrGen; + int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); diff --git a/QtQrGen/include/Qrimageprovider.hpp b/QtQrGen/include/esterv/utils/qr_image_provider.hpp similarity index 66% rename from QtQrGen/include/Qrimageprovider.hpp rename to QtQrGen/include/esterv/utils/qr_image_provider.hpp index df949d0..e8dc024 100644 --- a/QtQrGen/include/Qrimageprovider.hpp +++ b/QtQrGen/include/esterv/utils/qr_image_provider.hpp @@ -1,12 +1,19 @@ #include + +#if defined(QTQRGEN_SHARED) #include -#if defined(WINDOWS_GEN) -# define GEN_EXPORT Q_DECL_EXPORT + #ifdef WINDOWS_EXPORT + #define GEN_EXPORT Q_DECL_EXPORT + #else + #define GEN_EXPORT Q_DECL_IMPORT + #endif #else -#define GEN_EXPORT Q_DECL_IMPORT + #define GEN_EXPORT #endif +namespace Esterv::Utils::QrGen { + class GEN_EXPORT QRImageProvider : public QQuickImageProvider { public: @@ -22,4 +29,4 @@ class GEN_EXPORT QRImageProvider : public QQuickImageProvider }; - +} diff --git a/QtQrGen/Qrimageprovider.cpp b/QtQrGen/src/qr_image_provider.cpp similarity index 88% rename from QtQrGen/Qrimageprovider.cpp rename to QtQrGen/src/qr_image_provider.cpp index 1664c9e..5587ae8 100644 --- a/QtQrGen/Qrimageprovider.cpp +++ b/QtQrGen/src/qr_image_provider.cpp @@ -1,11 +1,10 @@ #include #include -#include "qrcodegen.hpp" -#include "Qrimageprovider.hpp" -#include +#include "esterv/utils/qrcode_gen.hpp" +#include "esterv/utils/qr_image_provider.hpp" -using namespace qrcodegen; +namespace Esterv::Utils::QrGen { QPixmap QRImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) { const int width = 100; @@ -30,4 +29,4 @@ QPixmap QRImageProvider::requestPixmap(const QString &id, QSize *size, const QSi Painter.end(); return pixmap; } - +} diff --git a/README.md b/README.md index 94efc35..c012cef 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# qrCode +# Esterv.Utils.QrCode [TOC] @@ -13,14 +13,14 @@ The GUI part will be based on Qt libraries and QML. Examples of this library com ```CMake include(FetchContent) FetchContent_Declare( - qrCode - GIT_REPOSITORY https://github.com/EddyTheCo/qrCode.git + EstervQrCode + GIT_REPOSITORY https://github.com/EddyTheCo/Esterv.Utils.QrCode.git GIT_TAG vMAJOR.MINOR.PATCH FIND_PACKAGE_ARGS MAJOR.MINOR CONFIG ) -FetchContent_MakeAvailable(qrCode) +FetchContent_MakeAvailable(EstervQrCode) -target_link_libraries( qrCode::QrGen qrCode::QtQrGen qrCode::QrDec qrCode::QtQrDec) +target_link_libraries( Esterv::QrGen Esterv::QtQrGen Esterv::QrDec Esterv::QtQrDec) ``` For more information check