From da7ab0055759859010de2941596d723aace6fc4a Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Sun, 8 Feb 2015 09:31:01 +0100 Subject: [PATCH 1/6] Restructuring of project. --- lib/qrencode/include/qrencode.h | 566 ------------------------ lib/qrencode/libqrencode.a | Bin 170124 -> 0 bytes qqrencode/libqtqrencode_global.h | 12 - qqrencode/qqrencode.pro | 37 -- qqrencode/qqrencode.cpp => qrencode.cpp | 0 qqrencode/qqrencode.h => qrencode.h | 0 qqrencode/qqrencode_p.h => qrencode_p.h | 0 qtqrencode.pri | 0 qtqrencode.pro | 41 +- test/main.cpp | 33 -- test/qqrencodetestsuite.cpp | 62 --- test/qqrencodetestsuite.h | 24 - test/test.pro | 40 -- test/testrunner.cpp | 27 -- test/testrunner.h | 34 -- 15 files changed, 35 insertions(+), 841 deletions(-) delete mode 100644 lib/qrencode/include/qrencode.h delete mode 100644 lib/qrencode/libqrencode.a delete mode 100644 qqrencode/libqtqrencode_global.h delete mode 100644 qqrencode/qqrencode.pro rename qqrencode/qqrencode.cpp => qrencode.cpp (100%) rename qqrencode/qqrencode.h => qrencode.h (100%) rename qqrencode/qqrencode_p.h => qrencode_p.h (100%) create mode 100644 qtqrencode.pri delete mode 100644 test/main.cpp delete mode 100644 test/qqrencodetestsuite.cpp delete mode 100644 test/qqrencodetestsuite.h delete mode 100644 test/test.pro delete mode 100644 test/testrunner.cpp delete mode 100644 test/testrunner.h diff --git a/lib/qrencode/include/qrencode.h b/lib/qrencode/include/qrencode.h deleted file mode 100644 index e554bb9..0000000 --- a/lib/qrencode/include/qrencode.h +++ /dev/null @@ -1,566 +0,0 @@ -/** - * qrencode - QR Code encoder - * - * Copyright (C) 2006-2012 Kentaro Fukuchi - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** \mainpage - * Libqrencode is a library for encoding data in a QR Code symbol, a kind of 2D - * symbology. - * - * \section encoding Encoding - * - * There are two methods to encode data: encoding a string/data or - * encoding a structured data. - * - * \subsection encoding-string Encoding a string/data - * You can encode a string by calling QRcode_encodeString(). - * The given string is parsed automatically and encoded. If you want to encode - * data that can be represented as a C string style (NUL terminated), you can - * simply use this way. - * - * If the input data contains Kanji (Shift-JIS) characters and you want to - * encode them as Kanji in QR Code, you should give QR_MODE_KANJI as a hint. - * Otherwise, all of non-alphanumeric characters are encoded as 8 bit data. - * If you want to encode a whole string in 8 bit mode, you can use - * QRcode_encodeString8bit() instead. - * - * Please note that a C string can not contain NUL characters. If your data - * contains NUL, you must use QRcode_encodeData(). - * - * \subsection encoding-input Encoding a structured data - * You can construct a structured input data manually. If the structure of the - * input data is known, you can use this way. - * At first, create a ::QRinput object by QRinput_new(). Then add input data - * to the QRinput object by QRinput_append(). Finally call QRcode_encodeInput() - * to encode the QRinput data. - * You can reuse the QRinput data again to encode it in other symbols with - * different parameters. - * - * \section result Result - * The encoded symbol is resulted as a ::QRcode object. It will contain - * its version number, width of the symbol and an array represents the symbol. - * See ::QRcode for the details. You can free the object by QRcode_free(). - * - * Please note that the version of the result may be larger than specified. - * In such cases, the input data would be too large to be encoded in a - * symbol of the specified version. - * - * \section structured Structured append - * Libqrencode can generate "Structured-appended" symbols that enables to split - * a large data set into mulitple QR codes. A QR code reader concatenates - * multiple QR code symbols into a string. - * Just like QRcode_encodeString(), you can use QRcode_encodeStringStructured() - * to generate structured-appended symbols. This functions returns an instance - * of ::QRcode_List. The returned list is a singly-linked list of QRcode: you - * can retrieve each QR code in this way: - * - * \code - * QRcode_List *qrcodes; - * QRcode_List *entry; - * QRcode *qrcode; - * - * qrcodes = QRcode_encodeStringStructured(...); - * entry = qrcodes; - * while(entry != NULL) { - * qrcode = entry->code; - * // do something - * entry = entry->next; - * } - * QRcode_List_free(entry); - * \endcode - * - * Instead of using auto-parsing functions, you can construct your own - * structured input. At first, instantiate an object of ::QRinput_Struct - * by calling QRinput_Struct_new(). This object can hold multiple ::QRinput, - * and one QR code is generated for a ::QRinput. - * QRinput_Struct_appendInput() appends a ::QRinput to a ::QRinput_Struct - * object. In order to generate structured-appended symbols, it is required to - * embed headers to each symbol. You can use - * QRinput_Struct_insertStructuredAppendHeaders() to insert appropriate - * headers to each symbol. You should call this function just once before - * encoding symbols. - */ - -#ifndef __QRENCODE_H__ -#define __QRENCODE_H__ - -#if defined(__cplusplus) -extern "C" { -#endif - -/** - * Encoding mode. - */ -typedef enum { - QR_MODE_NUL = -1, ///< Terminator (NUL character). Internal use only - QR_MODE_NUM = 0, ///< Numeric mode - QR_MODE_AN, ///< Alphabet-numeric mode - QR_MODE_8, ///< 8-bit data mode - QR_MODE_KANJI, ///< Kanji (shift-jis) mode - QR_MODE_STRUCTURE, ///< Internal use only - QR_MODE_ECI, ///< ECI mode - QR_MODE_FNC1FIRST, ///< FNC1, first position - QR_MODE_FNC1SECOND, ///< FNC1, second position -} QRencodeMode; - -/** - * Level of error correction. - */ -typedef enum { - QR_ECLEVEL_L = 0, ///< lowest - QR_ECLEVEL_M, - QR_ECLEVEL_Q, - QR_ECLEVEL_H ///< highest -} QRecLevel; - -/** - * Maximum version (size) of QR-code symbol. - */ -#define QRSPEC_VERSION_MAX 40 - -/** - * Maximum version (size) of QR-code symbol. - */ -#define MQRSPEC_VERSION_MAX 4 - - -/****************************************************************************** - * Input data (qrinput.c) - *****************************************************************************/ - -/** - * Singly linked list to contain input strings. An instance of this class - * contains its version and error correction level too. It is required to - * set them by QRinput_setVersion() and QRinput_setErrorCorrectionLevel(), - * or use QRinput_new2() to instantiate an object. - */ -typedef struct _QRinput QRinput; - -/** - * Instantiate an input data object. The version is set to 0 (auto-select) - * and the error correction level is set to QR_ECLEVEL_L. - * @return an input object (initialized). On error, NULL is returned and errno - * is set to indicate the error. - * @throw ENOMEM unable to allocate memory. - */ -extern QRinput *QRinput_new(void); - -/** - * Instantiate an input data object. - * @param version version number. - * @param level Error correction level. - * @return an input object (initialized). On error, NULL is returned and errno - * is set to indicate the error. - * @throw ENOMEM unable to allocate memory for input objects. - * @throw EINVAL invalid arguments. - */ -extern QRinput *QRinput_new2(int version, QRecLevel level); - -/** - * Instantiate an input data object. Object's Micro QR Code flag is set. - * Unlike with full-sized QR Code, version number must be specified (>0). - * @param version version number (1--4). - * @param level Error correction level. - * @return an input object (initialized). On error, NULL is returned and errno - * is set to indicate the error. - * @throw ENOMEM unable to allocate memory for input objects. - * @throw EINVAL invalid arguments. - */ -extern QRinput *QRinput_newMQR(int version, QRecLevel level); - -/** - * Append data to an input object. - * The data is copied and appended to the input object. - * @param input input object. - * @param mode encoding mode. - * @param size size of data (byte). - * @param data a pointer to the memory area of the input data. - * @retval 0 success. - * @retval -1 an error occurred and errno is set to indeicate the error. - * See Execptions for the details. - * @throw ENOMEM unable to allocate memory. - * @throw EINVAL input data is invalid. - * - */ -extern int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data); - -/** - * Append ECI header. - * @param input input object. - * @param ecinum ECI indicator number (0 - 999999) - * @retval 0 success. - * @retval -1 an error occurred and errno is set to indeicate the error. - * See Execptions for the details. - * @throw ENOMEM unable to allocate memory. - * @throw EINVAL input data is invalid. - * - */ -extern int QRinput_appendECIheader(QRinput *input, unsigned int ecinum); - -/** - * Get current version. - * @param input input object. - * @return current version. - */ -extern int QRinput_getVersion(QRinput *input); - -/** - * Set version of the QR code that is to be encoded. - * This function cannot be applied to Micro QR Code. - * @param input input object. - * @param version version number (0 = auto) - * @retval 0 success. - * @retval -1 invalid argument. - */ -extern int QRinput_setVersion(QRinput *input, int version); - -/** - * Get current error correction level. - * @param input input object. - * @return Current error correcntion level. - */ -extern QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input); - -/** - * Set error correction level of the QR code that is to be encoded. - * This function cannot be applied to Micro QR Code. - * @param input input object. - * @param level Error correction level. - * @retval 0 success. - * @retval -1 invalid argument. - */ -extern int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level); - -/** - * Set version and error correction level of the QR code at once. - * This function is recommened for Micro QR Code. - * @param input input object. - * @param version version number (0 = auto) - * @param level Error correction level. - * @retval 0 success. - * @retval -1 invalid argument. - */ -extern int QRinput_setVersionAndErrorCorrectionLevel(QRinput *input, int version, QRecLevel level); - -/** - * Free the input object. - * All of data chunks in the input object are freed too. - * @param input input object. - */ -extern void QRinput_free(QRinput *input); - -/** - * Validate the input data. - * @param mode encoding mode. - * @param size size of data (byte). - * @param data a pointer to the memory area of the input data. - * @retval 0 success. - * @retval -1 invalid arguments. - */ -extern int QRinput_check(QRencodeMode mode, int size, const unsigned char *data); - -/** - * Set of QRinput for structured symbols. - */ -typedef struct _QRinput_Struct QRinput_Struct; - -/** - * Instantiate a set of input data object. - * @return an instance of QRinput_Struct. On error, NULL is returned and errno - * is set to indicate the error. - * @throw ENOMEM unable to allocate memory. - */ -extern QRinput_Struct *QRinput_Struct_new(void); - -/** - * Set parity of structured symbols. - * @param s structured input object. - * @param parity parity of s. - */ -extern void QRinput_Struct_setParity(QRinput_Struct *s, unsigned char parity); - -/** - * Append a QRinput object to the set. QRinput created by QRinput_newMQR() - * will be rejected. - * @warning never append the same QRinput object twice or more. - * @param s structured input object. - * @param input an input object. - * @retval >0 number of input objects in the structure. - * @retval -1 an error occurred. See Exceptions for the details. - * @throw ENOMEM unable to allocate memory. - * @throw EINVAL invalid arguments. - */ -extern int QRinput_Struct_appendInput(QRinput_Struct *s, QRinput *input); - -/** - * Free all of QRinput in the set. - * @param s a structured input object. - */ -extern void QRinput_Struct_free(QRinput_Struct *s); - -/** - * Split a QRinput to QRinput_Struct. It calculates a parity, set it, then - * insert structured-append headers. QRinput created by QRinput_newMQR() will - * be rejected. - * @param input input object. Version number and error correction level must be - * set. - * @return a set of input data. On error, NULL is returned, and errno is set - * to indicate the error. See Exceptions for the details. - * @throw ERANGE input data is too large. - * @throw EINVAL invalid input data. - * @throw ENOMEM unable to allocate memory. - */ -extern QRinput_Struct *QRinput_splitQRinputToStruct(QRinput *input); - -/** - * Insert structured-append headers to the input structure. It calculates - * a parity and set it if the parity is not set yet. - * @param s input structure - * @retval 0 success. - * @retval -1 an error occurred and errno is set to indeicate the error. - * See Execptions for the details. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory. - */ -extern int QRinput_Struct_insertStructuredAppendHeaders(QRinput_Struct *s); - -/** - * Set FNC1-1st position flag. - */ -extern int QRinput_setFNC1First(QRinput *input); - -/** - * Set FNC1-2nd position flag and application identifier. - */ -extern int QRinput_setFNC1Second(QRinput *input, unsigned char appid); - -/****************************************************************************** - * QRcode output (qrencode.c) - *****************************************************************************/ - -/** - * QRcode class. - * Symbol data is represented as an array contains width*width uchars. - * Each uchar represents a module (dot). If the less significant bit of - * the uchar is 1, the corresponding module is black. The other bits are - * meaningless for usual applications, but here its specification is described. - * - *
- * MSB 76543210 LSB
- *     |||||||`- 1=black/0=white
- *     ||||||`-- data and ecc code area
- *     |||||`--- format information
- *     ||||`---- version information
- *     |||`----- timing pattern
- *     ||`------ alignment pattern
- *     |`------- finder pattern and separator
- *     `-------- non-data modules (format, timing, etc.)
- * 
- */ -typedef struct { - int version; ///< version of the symbol - int width; ///< width of the symbol - unsigned char *data; ///< symbol data -} QRcode; - -/** - * Singly-linked list of QRcode. Used to represent a structured symbols. - * A list is terminated with NULL. - */ -typedef struct _QRcode_List { - QRcode *code; - struct _QRcode_List *next; -} QRcode_List; - -/** - * Create a symbol from the input data. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param input input data. - * @return an instance of QRcode class. The version of the result QRcode may - * be larger than the designated version. On error, NULL is returned, - * and errno is set to indicate the error. See Exceptions for the - * details. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory for input objects. - */ -extern QRcode *QRcode_encodeInput(QRinput *input); - -/** - * Create a symbol from the string. The library automatically parses the input - * string and encodes in a QR Code symbol. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param string input string. It must be NUL terminated. - * @param version version of the symbol. If 0, the library chooses the minimum - * version for the given input data. - * @param level error correction level. - * @param hint tell the library how Japanese Kanji characters should be - * encoded. If QR_MODE_KANJI is given, the library assumes that the - * given string contains Shift-JIS characters and encodes them in - * Kanji-mode. If QR_MODE_8 is given, all of non-alphanumerical - * characters will be encoded as is. If you want to embed UTF-8 - * string, choose this. Other mode will cause EINVAL error. - * @param casesensitive case-sensitive(1) or not(0). - * @return an instance of QRcode class. The version of the result QRcode may - * be larger than the designated version. On error, NULL is returned, - * and errno is set to indicate the error. See Exceptions for the - * details. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory for input objects. - * @throw ERANGE input data is too large. - */ -extern QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive); - -/** - * Same to QRcode_encodeString(), but encode whole data in 8-bit mode. - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern QRcode *QRcode_encodeString8bit(const char *string, int version, QRecLevel level); - -/** - * Micro QR Code version of QRcode_encodeString(). - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern QRcode *QRcode_encodeStringMQR(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive); - -/** - * Micro QR Code version of QRcode_encodeString8bit(). - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern QRcode *QRcode_encodeString8bitMQR(const char *string, int version, QRecLevel level); - -/** - * Encode byte stream (may include '\0') in 8-bit mode. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param size size of the input data. - * @param data input data. - * @param version version of the symbol. If 0, the library chooses the minimum - * version for the given input data. - * @param level error correction level. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory for input objects. - * @throw ERANGE input data is too large. - */ -extern QRcode *QRcode_encodeData(int size, const unsigned char *data, int version, QRecLevel level); - -/** - * Micro QR Code version of QRcode_encodeData(). - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern QRcode *QRcode_encodeDataMQR(int size, const unsigned char *data, int version, QRecLevel level); - -/** - * Free the instance of QRcode class. - * @param qrcode an instance of QRcode class. - */ -extern void QRcode_free(QRcode *qrcode); - -/** - * Create structured symbols from the input data. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param s - * @return a singly-linked list of QRcode. - */ -extern QRcode_List *QRcode_encodeInputStructured(QRinput_Struct *s); - -/** - * Create structured symbols from the string. The library automatically parses - * the input string and encodes in a QR Code symbol. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param string input string. It must be NUL terminated. - * @param version version of the symbol. - * @param level error correction level. - * @param hint tell the library how Japanese Kanji characters should be - * encoded. If QR_MODE_KANJI is given, the library assumes that the - * given string contains Shift-JIS characters and encodes them in - * Kanji-mode. If QR_MODE_8 is given, all of non-alphanumerical - * characters will be encoded as is. If you want to embed UTF-8 - * string, choose this. Other mode will cause EINVAL error. - * @param casesensitive case-sensitive(1) or not(0). - * @return a singly-linked list of QRcode. On error, NULL is returned, and - * errno is set to indicate the error. See Exceptions for the details. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory for input objects. - */ -extern QRcode_List *QRcode_encodeStringStructured(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive); - -/** - * Same to QRcode_encodeStringStructured(), but encode whole data in 8-bit mode. - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern QRcode_List *QRcode_encodeString8bitStructured(const char *string, int version, QRecLevel level); - -/** - * Create structured symbols from byte stream (may include '\0'). Wholde data - * are encoded in 8-bit mode. - * @warning This function is THREAD UNSAFE when pthread is disabled. - * @param size size of the input data. - * @param data input dat. - * @param version version of the symbol. - * @param level error correction level. - * @return a singly-linked list of QRcode. On error, NULL is returned, and - * errno is set to indicate the error. See Exceptions for the details. - * @throw EINVAL invalid input object. - * @throw ENOMEM unable to allocate memory for input objects. - */ -extern QRcode_List *QRcode_encodeDataStructured(int size, const unsigned char *data, int version, QRecLevel level); - -/** - * Return the number of symbols included in a QRcode_List. - * @param qrlist a head entry of a QRcode_List. - * @return number of symbols in the list. - */ -extern int QRcode_List_size(QRcode_List *qrlist); - -/** - * Free the QRcode_List. - * @param qrlist a head entry of a QRcode_List. - */ -extern void QRcode_List_free(QRcode_List *qrlist); - - -/****************************************************************************** - * System utilities - *****************************************************************************/ - -/** - * Return a string that identifies the library version. - * @param major_version - * @param minor_version - * @param micro_version - */ -extern void QRcode_APIVersion(int *major_version, int *minor_version, int *micro_version); - -/** - * Return a string that identifies the library version. - * @return a string identifies the library version. The string is held by the - * library. Do NOT free it. - */ -extern char *QRcode_APIVersionString(void); - -/** - * Clear all caches. This is only for debug purpose. If you are attacking a - * complicated memory leak bug, try this to reduce the reachable blocks record. - * @warning This function is THREAD UNSAFE when pthread is disabled. - */ -extern void QRcode_clearCache(void); - -#if defined(__cplusplus) -} -#endif - -#endif /* __QRENCODE_H__ */ diff --git a/lib/qrencode/libqrencode.a b/lib/qrencode/libqrencode.a deleted file mode 100644 index 015233430736fb236a49fdf63fbcb16a0bf403c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170124 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 diff --git a/qqrencode/libqtqrencode_global.h b/qqrencode/libqtqrencode_global.h deleted file mode 100644 index 9ec2bc5..0000000 --- a/qqrencode/libqtqrencode_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef LIBQTQRENCODE_GLOBAL_H -#define LIBQTQRENCODE_GLOBAL_H - -#include - -#if defined(LIBQTQRENCODE_LIBRARY) -# define LIBQTQRENCODESHARED_EXPORT Q_DECL_EXPORT -#else -# define LIBQTQRENCODESHARED_EXPORT Q_DECL_IMPORT -#endif - -#endif // LIBQTQRENCODE_GLOBAL_H diff --git a/qqrencode/qqrencode.pro b/qqrencode/qqrencode.pro deleted file mode 100644 index d4534ab..0000000 --- a/qqrencode/qqrencode.pro +++ /dev/null @@ -1,37 +0,0 @@ -QT += core gui svg - -!win32-msvc2010 { - QMAKE_CXXFLAGS_DEBUG += -std=c++11 -Wno-write-strings - QMAKE_CXXFLAGS_RELEASE += -std=c++11 -Wno-write-strings -} - -TARGET = qtqrencode -TEMPLATE = lib - -DEFINES += LIBQTQRENCODE_LIBRARY - -SOURCES += qqrencode.cpp - -HEADERS += qqrencode.h \ - libqtqrencode_global.h \ - qqrencode_p.h - -header_files.files = qqrencode.h \ - libqtqrencode_global.h -header_files.path = /usr/include -INSTALLS += header_files - -win32 { - LIBS += -L$$PWD/../lib/qrencode -lqrencode -} else { - target.path = /usr/lib - INSTALLS += target - macx { - LIBS += -L/usr/local/lib -lqrencode - } else { - LIBS += -lqrencode - } -} - -INCLUDEPATH += $$PWD/../lib/qrencode/include -DEPENDPATH += $$PWD/../lib/qrencode/include diff --git a/qqrencode/qqrencode.cpp b/qrencode.cpp similarity index 100% rename from qqrencode/qqrencode.cpp rename to qrencode.cpp diff --git a/qqrencode/qqrencode.h b/qrencode.h similarity index 100% rename from qqrencode/qqrencode.h rename to qrencode.h diff --git a/qqrencode/qqrencode_p.h b/qrencode_p.h similarity index 100% rename from qqrencode/qqrencode_p.h rename to qrencode_p.h diff --git a/qtqrencode.pri b/qtqrencode.pri new file mode 100644 index 0000000..e69de29 diff --git a/qtqrencode.pro b/qtqrencode.pro index c052998..d4534ab 100644 --- a/qtqrencode.pro +++ b/qtqrencode.pro @@ -1,8 +1,37 @@ -lessThan(QT_MAJOR_VERSION, 5) { - error("Cannot build with Qt version $${QT_VERSION}, this project requires at least Qt 5") +QT += core gui svg + +!win32-msvc2010 { + QMAKE_CXXFLAGS_DEBUG += -std=c++11 -Wno-write-strings + QMAKE_CXXFLAGS_RELEASE += -std=c++11 -Wno-write-strings +} + +TARGET = qtqrencode +TEMPLATE = lib + +DEFINES += LIBQTQRENCODE_LIBRARY + +SOURCES += qqrencode.cpp + +HEADERS += qqrencode.h \ + libqtqrencode_global.h \ + qqrencode_p.h + +header_files.files = qqrencode.h \ + libqtqrencode_global.h +header_files.path = /usr/include +INSTALLS += header_files + +win32 { + LIBS += -L$$PWD/../lib/qrencode -lqrencode +} else { + target.path = /usr/lib + INSTALLS += target + macx { + LIBS += -L/usr/local/lib -lqrencode + } else { + LIBS += -lqrencode + } } -TEMPLATE = subdirs -SUBDIRS += \ - qqrencode \ - test +INCLUDEPATH += $$PWD/../lib/qrencode/include +DEPENDPATH += $$PWD/../lib/qrencode/include diff --git a/test/main.cpp b/test/main.cpp deleted file mode 100644 index 7de3637..0000000 --- a/test/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "qqrencodetestsuite.h" -#include "testrunner.h" - -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - QCoreApplication app(argc, argv); - -#if QT_VERSION < QT_VERSION_CHECK(5,0,0) - QTextCodec *codec = QTextCodec::codecForName("UTF-8"); - QTextCodec::setCodecForCStrings(codec); -#endif - - // Perform tests - TestRunner runner(QStringList(), &app); - /** - * Add tests here - */ - runner.addTest(new QQREncodeTestSuite(&app)); - QObject::connect(&runner, &TestRunner::finished, [&] (int result) - { - qDebug() << "Overall Result: " << (result == 0 ? "PASS" : "FAIL"); - app.quit(); - }); - QTimer::singleShot(0, &runner, SLOT(run())); - - return app.exec(); -} - diff --git a/test/qqrencodetestsuite.cpp b/test/qqrencodetestsuite.cpp deleted file mode 100644 index 4015563..0000000 --- a/test/qqrencodetestsuite.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "qqrencodetestsuite.h" - -#include -#include -#include - -const QString RESULTS_PATH = "./results/"; - -QQREncodeTestSuite::QQREncodeTestSuite(QObject *parent) : - QObject(parent) -{ -} - -void QQREncodeTestSuite::initTestCase() -{ - QDir().rmpath(RESULTS_PATH); - QDir().mkpath(RESULTS_PATH); -} - -void QQREncodeTestSuite::accessors() -{ - QQREncode encoder; - encoder.setLevel(QQREncode::ErrorCorrectionLevel::HIGH); - QCOMPARE(encoder.getLevel(),QQREncode::ErrorCorrectionLevel::HIGH); - encoder.setVersion(40); - QCOMPARE(encoder.version(), 40); - encoder.setMargin(8); - QCOMPARE(encoder.margin(),8); - encoder.setMicro(true); - QCOMPARE(encoder.isMicro(),true); -} - -void QQREncodeTestSuite::encodeAlphaNumeric() -{ - QQREncode encoder; - QVERIFY(encoder.encode(QString("abcdefghijklmnopqrstuvwxyz 1234567890$%*+-./:"))); - encoder.toSVG(RESULTS_PATH + "alphanumeric.svg",200); - QImage code = encoder.toQImage(); - code.scaled(200,200).save(RESULTS_PATH + "alphanumeric.png","PNG"); -} - -void QQREncodeTestSuite::encodeByteArray() -{ - QQREncode encoder; - unsigned char testdata[] = {0xF3, 0xFF, 0xFE, 0xF1}; - QVERIFY(encoder.encode(QByteArray((const char*)testdata, 4))); - encoder.toSVG(RESULTS_PATH + "bytearray.svg",200); - QImage code = encoder.toQImage(); - code.scaled(200,200).save(RESULTS_PATH + "bytearray.png","PNG"); -} - -void QQREncodeTestSuite::encodeKanji() -{ - QQREncode encoder; - QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); - QVERIFY(encoder.encodeKanji(codec->fromUnicode(QString("お疲れ様テスト。")))); -// delete codec; - encoder.toSVG(RESULTS_PATH + "kanji.svg",200); - QImage code = encoder.toQImage(); - code.scaled(200,200).save(RESULTS_PATH + "kanji.png","PNG"); -} - diff --git a/test/qqrencodetestsuite.h b/test/qqrencodetestsuite.h deleted file mode 100644 index de96d63..0000000 --- a/test/qqrencodetestsuite.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef QQRENCODETESTSUITE_H -#define QQRENCODETESTSUITE_H - -#include - -/** - * For now, manual inspection of images is needed to verify the resulting QR is correct. - * @brief The QQREncodeTestSuite class - */ -class QQREncodeTestSuite : public QObject -{ - Q_OBJECT -public: - explicit QQREncodeTestSuite(QObject *parent = 0); - -private slots: - void initTestCase(); - void accessors(); - void encodeAlphaNumeric(); - void encodeByteArray(); - void encodeKanji(); -}; - -#endif // QQRENCODETESTSUITE_H diff --git a/test/test.pro b/test/test.pro deleted file mode 100644 index c994ee1..0000000 --- a/test/test.pro +++ /dev/null @@ -1,40 +0,0 @@ -QT += core testlib - -!win32-msvc2010 { - QMAKE_CXXFLAGS_DEBUG += -std=c++11 - QMAKE_CXXFLAGS_RELEASE += -std=c++11 -} - -TARGET = tester -CONFIG += console - -TEMPLATE = app - -SOURCES += \ - main.cpp \ - testrunner.cpp \ - qqrencodetestsuite.cpp - -HEADERS += \ - testrunner.h \ - qqrencodetestsuite.h - -win32:CONFIG(release, debug|release) { - # WINDOWS RELEASE - PRE_TARGETDEPS += $$OUT_PWD/../qqrencode/release/qtqrencode.dll - LIBS += -L$$OUT_PWD/../qqrencode/release/ -lqtqrencode - -} else:win32:CONFIG(debug, debug|release) { - # WINDOWS DEBUG - PRE_TARGETDEPS += $$OUT_PWD/../qqrencode/debug/qtqrencode.dll - LIBS += -L$$OUT_PWD/../qqrencode/debug/ -lqtqrencode -} else:CONFIG(release, debug|release) { - PRE_TARGETDEPS += $$OUT_PWD/../qqrencode/libqtqrencode.so - LIBS += -L$$OUT_PWD/../qqrencode/ -lqtqrencode -} else:CONFIG(debug, debug|release) { - PRE_TARGETDEPS += $$OUT_PWD/../qqrencode/libqtqrencode.so - LIBS += -L$$OUT_PWD/../qqrencode/ -lqtqrencode -} - -INCLUDEPATH += $$PWD/../qqrencode -DEPENDPATH += $$PWD/../qqrencode diff --git a/test/testrunner.cpp b/test/testrunner.cpp deleted file mode 100644 index 0aa6c97..0000000 --- a/test/testrunner.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "testrunner.h" - -TestRunner::TestRunner(QStringList args, QObject *parent) : - QObject(parent), - m_arguments(args) -{ -} - -void TestRunner::addTest(QObject *test) -{ - test->setParent(this); - m_tests.append(test); -} - - -void TestRunner::run() -{ - foreach (QObject *test, m_tests) - { - m_overallResult = QTest::qExec(test, m_arguments); - if (m_overallResult != 0) - { - break; - } - } - emit finished(m_overallResult); -} diff --git a/test/testrunner.h b/test/testrunner.h deleted file mode 100644 index c661de8..0000000 --- a/test/testrunner.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TESTRUNNER_H -#define TESTRUNNER_H - -#include -#include -#include -#include - -/** - * @brief The TestRunner class - * Inspired from mlvljr's TestRunner here: - * http://stackoverflow.com/questions/1524390/what-unit-testing-framework-should-i-use-for-qt - */ -class TestRunner : public QObject -{ - Q_OBJECT -public: - explicit TestRunner(QStringList args, QObject *parent = 0); - - void addTest(QObject *test); - -signals: - void finished(int result); - -public slots: - void run(); - -private: - QStringList m_arguments; - QList m_tests; - int m_overallResult; -}; - -#endif // TESTRUNNER_H From abf7ef7bc685b313636e3e1f495db784e8cd5b68 Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Sun, 8 Feb 2015 10:01:02 +0100 Subject: [PATCH 2/6] Made compatible with qt-pods. --- qrencode.cpp => qtqrencode.cpp | 80 ++++++++++++++++++---------------- qrencode.h => qtqrencode.h | 17 +++----- qtqrencode.pri | 5 +++ qtqrencode.pro | 30 +++---------- qrencode_p.h => qtqrencode_p.h | 16 ++++--- 5 files changed, 69 insertions(+), 79 deletions(-) rename qrencode.cpp => qtqrencode.cpp (80%) rename qrencode.h => qtqrencode.h (77%) rename qrencode_p.h => qtqrencode_p.h (76%) diff --git a/qrencode.cpp b/qtqrencode.cpp similarity index 80% rename from qrencode.cpp rename to qtqrencode.cpp index b85d3b1..a2f7fcc 100644 --- a/qrencode.cpp +++ b/qtqrencode.cpp @@ -1,17 +1,21 @@ -#include "qqrencode.h" -#include "qqrencode_p.h" +// Own includes +#include "qtqrencode.h" +#include "qtqrencode_p.h" +// QrEncode includes +#include + +// Qt includes #include #include #define INCHES_PER_METER (100.0/2.54) -QQREncodePrivate::~QQREncodePrivate() -{ +QREncodePrivate::~QREncodePrivate() { QRcode_free(m_code); } -void QQREncodePrivate::paint(QPainter &painter) +void QREncodePrivate::paint(QPainter &painter) { unsigned char *row, *p; int x, y; @@ -38,18 +42,18 @@ void QQREncodePrivate::paint(QPainter &painter) } } -QQREncode::QQREncode() - : d_ptr(new QQREncodePrivate(this)) +QREncode::QREncode() + : d_ptr(new QREncodePrivate(this)) { } -QQREncode::~QQREncode() +QREncode::~QREncode() { } -void QQREncode::setLevel(QQREncode::ErrorCorrectionLevel value) +void QREncode::setLevel(QREncode::ErrorCorrectionLevel value) { - Q_D(QQREncode); + Q_D(QREncode); switch (value) { case LOW: d->m_level = QR_ECLEVEL_L; @@ -66,9 +70,9 @@ void QQREncode::setLevel(QQREncode::ErrorCorrectionLevel value) } } -QQREncode::ErrorCorrectionLevel QQREncode::getLevel() const +QREncode::ErrorCorrectionLevel QREncode::getLevel() const { - Q_D(const QQREncode); + Q_D(const QREncode); switch (d->m_level) { case QR_ECLEVEL_L: return LOW; @@ -99,61 +103,61 @@ QQREncode::ErrorCorrectionLevel QQREncode::getLevel() const //} -void QQREncode::setVersion(int version) +void QREncode::setVersion(int version) { - Q_D(QQREncode); + Q_D(QREncode); // 1 - 40 if (version > 0 && version <= 40) d->m_version = version; } -int QQREncode::version() const +int QREncode::version() const { - Q_D(const QQREncode); + Q_D(const QREncode); return d->m_version; } -void QQREncode::setMargin(int value) +void QREncode::setMargin(int value) { - Q_D(QQREncode); + Q_D(QREncode); if (value > -1) d->m_margin = value; } -int QQREncode::margin() const +int QREncode::margin() const { - Q_D(const QQREncode); + Q_D(const QREncode); return d->m_margin; } -void QQREncode::setMicro(bool value) +void QREncode::setMicro(bool value) { - Q_D(QQREncode); + Q_D(QREncode); d->m_micro = (value) ? 1 : 0; } -bool QQREncode::isMicro() const +bool QREncode::isMicro() const { - Q_D(const QQREncode); + Q_D(const QREncode); return (d->m_micro == 1) ? true : false; } -void QQREncode::setBackground(QColor color) +void QREncode::setBackground(QColor color) { - Q_D(QQREncode); + Q_D(QREncode); d->m_bg.setColor(color); } -void QQREncode::setForeground(QColor color) +void QREncode::setForeground(QColor color) { - Q_D(QQREncode); + Q_D(QREncode); d->m_fg.setColor(color); d->m_pen.setColor(color); } -bool QQREncode::encode(QByteArray input) +bool QREncode::encode(QByteArray input) { - Q_D(QQREncode); + Q_D(QREncode); QRcode *c = NULL; if (input.isEmpty()) return false; if (d->m_micro) { @@ -171,9 +175,9 @@ bool QQREncode::encode(QByteArray input) return true; } -bool QQREncode::encode(QString input, bool caseSensitive) +bool QREncode::encode(QString input, bool caseSensitive) { - Q_D(QQREncode); + Q_D(QREncode); if (input.isEmpty()) return false; QRcode *c = NULL; if (d->m_micro) { @@ -197,9 +201,9 @@ bool QQREncode::encode(QString input, bool caseSensitive) return true; } -bool QQREncode::encodeKanji(QByteArray input, bool caseSensitive) +bool QREncode::encodeKanji(QByteArray input, bool caseSensitive) { - Q_D(QQREncode); + Q_D(QREncode); if (input.isEmpty()) return false; QRcode *c = NULL; if (d->m_micro) { @@ -223,9 +227,9 @@ bool QQREncode::encodeKanji(QByteArray input, bool caseSensitive) return true; } -bool QQREncode::toSVG(QString output, int size) +bool QREncode::toSVG(QString output, int size) { - Q_D(QQREncode); + Q_D(QREncode); if (output.isEmpty() || d->m_code == NULL) { return false; } @@ -244,9 +248,9 @@ bool QQREncode::toSVG(QString output, int size) return true; } -QImage QQREncode::toQImage(int size) +QImage QREncode::toQImage(int size) { - Q_D(QQREncode); + Q_D(QREncode); if (size < 0) throw std::invalid_argument("Invalid size"); if (d->m_code == NULL) { diff --git a/qrencode.h b/qtqrencode.h similarity index 77% rename from qrencode.h rename to qtqrencode.h index 4ebf668..e1efa3f 100644 --- a/qrencode.h +++ b/qtqrencode.h @@ -3,12 +3,9 @@ #include -#include "libqtqrencode_global.h" +class QREncodePrivate; -class QQREncodePrivate; - -class LIBQTQRENCODESHARED_EXPORT QQREncode -{ +class QREncode { Q_GADGET Q_ENUMS(ErrorCorrectionLevel) @@ -20,8 +17,8 @@ class LIBQTQRENCODESHARED_EXPORT QQREncode HIGH }; - QQREncode(); - ~QQREncode(); + QREncode(); + ~QREncode(); void setLevel(ErrorCorrectionLevel value); ErrorCorrectionLevel getLevel() const; @@ -44,9 +41,9 @@ class LIBQTQRENCODESHARED_EXPORT QQREncode // ToDo: encode structured, rle private: - Q_DISABLE_COPY(QQREncode) - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(QQREncode) + Q_DISABLE_COPY(QREncode) + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(QREncode) }; #endif // QQRENCODE_H diff --git a/qtqrencode.pri b/qtqrencode.pri index e69de29..d75957e 100644 --- a/qtqrencode.pri +++ b/qtqrencode.pri @@ -0,0 +1,5 @@ +INCLUDEPATH += \ + $$PWD + +LIBS += \ + -L../qtqrencode -lqtqrencode diff --git a/qtqrencode.pro b/qtqrencode.pro index d4534ab..21396e4 100644 --- a/qtqrencode.pro +++ b/qtqrencode.pro @@ -8,30 +8,10 @@ QT += core gui svg TARGET = qtqrencode TEMPLATE = lib -DEFINES += LIBQTQRENCODE_LIBRARY +SOURCES += \ + qtqrencode.cpp -SOURCES += qqrencode.cpp +HEADERS += \ + qtqrencode.h \ + qtqrencode_p.h -HEADERS += qqrencode.h \ - libqtqrencode_global.h \ - qqrencode_p.h - -header_files.files = qqrencode.h \ - libqtqrencode_global.h -header_files.path = /usr/include -INSTALLS += header_files - -win32 { - LIBS += -L$$PWD/../lib/qrencode -lqrencode -} else { - target.path = /usr/lib - INSTALLS += target - macx { - LIBS += -L/usr/local/lib -lqrencode - } else { - LIBS += -lqrencode - } -} - -INCLUDEPATH += $$PWD/../lib/qrencode/include -DEPENDPATH += $$PWD/../lib/qrencode/include diff --git a/qrencode_p.h b/qtqrencode_p.h similarity index 76% rename from qrencode_p.h rename to qtqrencode_p.h index 1a41e8d..77a2987 100644 --- a/qrencode_p.h +++ b/qtqrencode_p.h @@ -1,28 +1,32 @@ #ifndef QQRENCODE_P_H #define QQRENCODE_P_H -#include "qqrencode.h" +// Own includes +#include "qtqrencode.h" +// QrEncode includes #include + +// Qt includes #include -class QQREncodePrivate +class QREncodePrivate { - Q_DECLARE_PUBLIC(QQREncode) + Q_DECLARE_PUBLIC(QREncode) public: - QQREncodePrivate(QQREncode *qqrencode) + QREncodePrivate(QREncode *qqrencode) : q_ptr(qqrencode), m_code(NULL), m_level(QR_ECLEVEL_L),m_version(1), m_margin(4), m_micro(0), m_pen(Qt::black, 0.1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin), m_bg(Qt::white), m_fg(Qt::black) { } - ~QQREncodePrivate(); + ~QREncodePrivate(); void paint(QPainter &painter); - QQREncode *q_ptr; + QREncode *q_ptr; QRcode *m_code; QRecLevel m_level; int m_version; From ee9e69d0f395f45e4d88a19cad721db94be4a24c Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Sun, 8 Feb 2015 10:04:16 +0100 Subject: [PATCH 3/6] Updated README. --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d771d57..aebf5d0 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,14 @@ +[![Qt Pods](http://qt-pods.org/assets/logo.png "Qt Pods")](http://qt-pods.org) ## qtqrencode Qt 5 wrapper and renderer for [qrencode](https://github.com/fukuchi/libqrencode) (QR Code encoding) library. -## Build +## Build (via qt-pods) + +You can add QrEncode to your project with a single click using qt-pods. Read more about qt-pods here: +https://github.com/cybercatalyst/qt-pods + +## Manual build You will need [Qt 5+](http://qt-project.org/downloads) and [qrencode 3.4+](http://fukuchi.org/works/qrencode). Clone this repo and build it with Qt's qmake: ```bash From bc5f65747c5d5aa9ba9a5bc557a0f29b34504ee4 Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Sun, 8 Feb 2015 10:08:47 +0100 Subject: [PATCH 4/6] Renamed enum values. --- qtqrencode.cpp | 18 +++++++++--------- qtqrencode.h | 9 +++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/qtqrencode.cpp b/qtqrencode.cpp index a2f7fcc..3d90201 100644 --- a/qtqrencode.cpp +++ b/qtqrencode.cpp @@ -55,16 +55,16 @@ void QREncode::setLevel(QREncode::ErrorCorrectionLevel value) { Q_D(QREncode); switch (value) { - case LOW: + case ErrorCorrectionLevelLow: d->m_level = QR_ECLEVEL_L; break; - case MEDIUM: + case ErrorCorrectionLevelMedium: d->m_level = QR_ECLEVEL_M; break; - case QUARTILE: + case ErrorCorrectionLevelQuartile: d->m_level = QR_ECLEVEL_Q; break; - case HIGH: + case ErrorCorrectionLevelHigh: d->m_level = QR_ECLEVEL_H; break; } @@ -75,15 +75,15 @@ QREncode::ErrorCorrectionLevel QREncode::getLevel() const Q_D(const QREncode); switch (d->m_level) { case QR_ECLEVEL_L: - return LOW; + return ErrorCorrectionLevelLow; case QR_ECLEVEL_M: - return MEDIUM; + return ErrorCorrectionLevelMedium; case QR_ECLEVEL_Q: - return QUARTILE; + return ErrorCorrectionLevelQuartile; case QR_ECLEVEL_H: - return HIGH; + return ErrorCorrectionLevelHigh; } - return LOW; + return ErrorCorrectionLevelLow; } //bool QQREncode::encode(QString code, QString output) diff --git a/qtqrencode.h b/qtqrencode.h index e1efa3f..ef235ac 100644 --- a/qtqrencode.h +++ b/qtqrencode.h @@ -1,6 +1,7 @@ #ifndef QQRENCODE_H #define QQRENCODE_H +// Qt includes #include class QREncodePrivate; @@ -11,10 +12,10 @@ class QREncode { public: enum ErrorCorrectionLevel { - LOW, - MEDIUM, - QUARTILE, - HIGH + ErrorCorrectionLevelLow, + ErrorCorrectionLevelMedium, + ErrorCorrectionLevelQuartile, + ErrorCorrectionLevelHigh }; QREncode(); From bb083b10154d715ef56c260b18027da66dfe2904 Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Sun, 8 Feb 2015 10:10:26 +0100 Subject: [PATCH 5/6] Fixed pri. --- qtqrencode.pri | 2 ++ 1 file changed, 2 insertions(+) diff --git a/qtqrencode.pri b/qtqrencode.pri index d75957e..37af8bf 100644 --- a/qtqrencode.pri +++ b/qtqrencode.pri @@ -3,3 +3,5 @@ INCLUDEPATH += \ LIBS += \ -L../qtqrencode -lqtqrencode + +LIBS += -lqrencode From f1e2b376062bb54426c9ddb66c2d56db7e2628a0 Mon Sep 17 00:00:00 2001 From: Jacob Dawid Date: Tue, 10 Feb 2015 12:42:07 +0100 Subject: [PATCH 6/6] Fixed compilation on MacOS. --- qtqrencode.cpp | 11 +++++++++-- qtqrencode.pri | 6 ++++++ qtqrencode.pro | 2 ++ qtqrencode_p.h | 5 +++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/qtqrencode.cpp b/qtqrencode.cpp index 3d90201..cf7c1b5 100644 --- a/qtqrencode.cpp +++ b/qtqrencode.cpp @@ -3,7 +3,12 @@ #include "qtqrencode_p.h" // QrEncode includes +#ifdef Q_OS_MAC +// This is where brew puts the header +#include "/usr/local/include/qrencode.h" +#else #include +#endif // Qt includes #include @@ -251,10 +256,12 @@ bool QREncode::toSVG(QString output, int size) QImage QREncode::toQImage(int size) { Q_D(QREncode); - if (size < 0) throw std::invalid_argument("Invalid size"); + if (size < 0) { + return QImage(); + } if (d->m_code == NULL) { - std::logic_error("No qr code to convert"); + return QImage(); } int symwidth = d->m_code->width + d->m_margin * 2; diff --git a/qtqrencode.pri b/qtqrencode.pri index 37af8bf..24b4215 100644 --- a/qtqrencode.pri +++ b/qtqrencode.pri @@ -4,4 +4,10 @@ INCLUDEPATH += \ LIBS += \ -L../qtqrencode -lqtqrencode +mac { + # This is where brew puts the lib in + LIBS += -L/usr/local/lib/ +} + LIBS += -lqrencode + diff --git a/qtqrencode.pro b/qtqrencode.pro index 21396e4..b4d2430 100644 --- a/qtqrencode.pro +++ b/qtqrencode.pro @@ -1,5 +1,7 @@ QT += core gui svg +CONFIG += staticlib + !win32-msvc2010 { QMAKE_CXXFLAGS_DEBUG += -std=c++11 -Wno-write-strings QMAKE_CXXFLAGS_RELEASE += -std=c++11 -Wno-write-strings diff --git a/qtqrencode_p.h b/qtqrencode_p.h index 77a2987..602aa61 100644 --- a/qtqrencode_p.h +++ b/qtqrencode_p.h @@ -5,7 +5,12 @@ #include "qtqrencode.h" // QrEncode includes +#ifdef Q_OS_MAC +// This is where brew puts the header +#include "/usr/local/include/qrencode.h" +#else #include +#endif // Qt includes #include