An open API service indexing awesome lists of open source software.

https://github.com/kanglin/rabbitcommon

Qt common library
https://github.com/kanglin/rabbitcommon

Last synced: over 1 year ago
JSON representation

Qt common library

Awesome Lists containing this project

README

          

## Qt common library

================================================

Author:Kang Lin(kl222@126.com)

[![master status](https://github.com/KangLin/RabbitCommon/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/KangLin/RabbitCommon/actions/workflows/build.yml)
[![develop status](https://github.com/KangLin/RabbitCommon/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/KangLin/RabbitCommon/actions/workflows/build.yml)
[![Build status](https://ci.appveyor.com/api/projects/status/cy6jwbbysuj7t1wp?svg=true)](https://ci.appveyor.com/project/KangLin/rabbitcommon)

[:cn: Chinese](README_zh_CN.md)

- Project home site: https://github.com/KangLin/RabbitCommon
- Mirror:
- https://sourceforge.net/projects/rabbitcommon/
- https://launchpad.net/rabbitcommon
- https://gitlab.com/kl222/RabbitCommon
- https://invent.kde.org/kanglin/RabbitCommon
- https://gitee.com/kl222/RabbitCommon
- https://bitbucket.org/kl222/rabbitcommon
### Developer documents

[Online developer documents](https://kanglin.github.io/RabbitCommon/English/html/index.html)

### Latest release

- [Latest release](https://github.com/KangLin/RabbitCommon/releases/latest)
- See:
- Semantic Versioning: https://semver.org/

### Functions

[API](https://kanglin.github.io/RabbitCommon/English/html/group__API.html)

Qt common library. include follow functions:

- [x] GUI
- [x] [About](#About)
+ [cmark](https://github.com/commonmark/cmark): support MarkDown
- [x] [Updater](#Updater)
- [x] [Style (include icon theme)](Src/FrmStyle/FrmStyle.h)
- [x] [Recent open menu](Src/RabbitRecentMenu.h)
- [x] [Title bar](Src/TitleBar.h)
- [x] [Folder browser](Src/FolderBrowser/FolderBrowser.h)
- [x] [Download the same file from multiple URLs](Src/DownloadFile.h)
- [x] [Directory functions](Src/RabbitCommonDir.h)
- [x] [Encrypt](Src/RabbitCommonEncrypt.h)
- [x] [Register](Src/RabbitCommonRegister.h)
- [x] Tools
+ [x] [Execute the program with administrator privileges](#execute-the-program-with-administrator-privileges)
+ [x] [The program starts automatically](#the-program-starts-automatically)
+ [x] [Directory functions](Src/RabbitCommonDir.h)
+ [x] [Get system information](#Get-system-information)
- [x] [Get current login user name](#Get-current-login-user-name)
- [x] cmake functions
+ [x] Translations
+ [x] Add target, plugin target
+ [x] Generate pkg-config configure file
+ [x] Generate cmake configure file
+ [x] Add uninstall target
- [x] Cross-platform, support multiple operating systems
- [x] Windows
- [x] Linux、Unix
- [x] Android
- [ ] Mac os
- [ ] IOS

Mac os and IOS, I don't have the corresponding equipment,
please compile and test the students with the corresponding equipment.

See: [Qt5](https://doc.qt.io/qt-5/supported-platforms.html), [Qt6](https://doc.qt.io/qt-6/supported-platforms.html)

### Compile
- Create and entry build directory

git clone --recursive https://github.com/KangLin/RabbitCommon.git
cd RabbitCommon
mkdir build

- Compile
+ Use cmake

cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
-DQT_DIR=... \
-DQt5_DIR=${QT_ROOT}/lib/cmake/Qt5
cmake --build .

* Parameter
- CMAKE_BUILD_TYPE: build type(MUST)
- QT_DIR: Qt install position
- BUILD_DOCS: build doxygen documents
- BUILD_APP: build app
- BUILD_ABOUT: build about
- BUILD_UPDATE: build updater
- BUILD_ADMINAUTHORISER: build admin authoriser

**NOTE**: If you use MSVC, you need to add -DCMAKE_BUILD_TYPE=Debug,
otherwise the following error will occur when compiling Debug:

RabbitCommonTools.obj : error LNK2019: An external symbol that cannot be resolved "int __cdecl qInitResources_translations_RabbitCommon(void)" (?qInitResources_translations_RabbitCommon@@YAHXZ),该符号在函数 "void __cdecl g_RabbitCommon_InitResource(void)" (?g_RabbitCommon_InitResource@@YAXXZ) 中被引用
RabbitCommonTools.obj : error LNK2019: An external symbol that cannot be resolved "int __cdecl qCleanupResources_translations_RabbitCommon(void)" (?qCleanupResources_translations_RabbitCommon@@YAHXZ),该符号在函数 "void __cdecl g_RabbitCommon_CleanResource(void)" (?g_RabbitCommon_CleanResource@@YAXXZ) 中被引用

- linux

cd build
cmake .. -DCMAKE_INSTALL_PREFIX=`pwd`/install \
-DCMAKE_BUILD_TYPE=Release \
-DQT_DIR=... \
-DQt5_DIR=${QT_ROOT}/lib/cmake/Qt5
cmake --build . --config Release --target install

- windows

cd build
cmake .. -DCMAKE_INSTALL_PREFIX=`pwd`/install ^
-DCMAKE_BUILD_TYPE=Release ^
-DQT_DIR=... ^
-DQt5_DIR=${QT_ROOT}/lib/cmake/Qt5
cmake --build . --config Release --target install

- Android
- Qt6 or laster

cd build
${Qt6_DIR}/bin/qt-cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

Or:

cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=`pwd`/android-build \
-DCMAKE_TOOLCHAIN_FILE=$Qt6_DIR/lib/cmake/Qt6/qt.toolchain.cmake
cmake --build . --config Release

- The host is linux

cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=`pwd`/android-build \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="armeabi-v7a with NEON" \
-DANDROID_PLATFORM=android-18 \
-DQT_DIR=... \
-DQt5_DIR=${QT_ROOT}/lib/cmake/Qt5
cmake --build . --config Release --target all

- The host is windows

cd build
cmake .. -G"Unix Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_INSTALL_PREFIX=`pwd`/android-build ^
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake ^
-DCMAKE_MAKE_PROGRAM=${ANDROID_NDK}/prebuilt/windows-x86_64/bin/make.exe ^
-DANDROID_PLATFORM=android-18 ^
-DANDROID_ABI=arm64-v8a ^
-DANDROID_ARM_NEON=ON ^
-DQT_DIR=... \
-DQt5_DIR=${QT_ROOT}/lib/cmake/Qt5
cmake --build . --config Release --target all

- Parameter Description: https://developer.android.google.cn/ndk/guides/cmake
+ ANDROID_ABI: The following values can be taken:
Goal ABI. If the target ABI is not specified, CMake uses armeabi-v7a by default.
Valid ABI are:
- armeabi:CPU with software floating point arithmetic based on ARMv5TE
- armeabi-v7a:ARMv7-based device with hardware FPU instructions (VFP v3 D16)
- armeabi-v7a with NEON:Same as armeabi-v7a, but with NEON floating point instructions enabled. This is equivalent to setting -DANDROID_ABI=armeabi-v7a and -DANDROID_ARM_NEON=ON.
- arm64-v8a:ARMv8 AArch64 Instruction Set
- x86:IA-32 Instruction Set
- x86_64 - x86-64 Instruction Set
+ ANDROID_NDK The path of installed ndk in host
+ ANDROID_PLATFORM: For a full list of platform names and corresponding Android system images, see the [Android NDK Native API] (https://developer.android.google.com/ndk/guides/stable_apis.html)
+ ANDROID_ARM_MODE
+ ANDROID_ARM_NEON
+ ANDROID_STL: Specifies the STL that CMake should use.
- c++_shared: The shared library variant of libc++.
- c++_static: The static library variant of libc++.
- none: No C++ standard library support.
- system: The system STL

- Install apk to devices

adb install android-build-debug.apk

- Qt6 and later

cd build
${Qt6_DIR}/bin/qt-cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

Or:

cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=`pwd`/android-build \
-DCMAKE_TOOLCHAIN_FILE=$Qt6_DIR/lib/cmake/Qt6/qt.toolchain.cmake
cmake --build . --config Release

+ Use qmake. (Deprecated, please use CMake for new programs)

cd build
qmake ../RabbitCommon.pro
make install

* Parameter
- BUILD_DOCS: build doxygen documents
- BUILD_ABOUT=OFF: Off build about
- BUILD_UPDATE=OFF: Off build updater
- BUILD_ADMINAUTHORISER=OFF: Off admin authoriser

- Compilation notes:
Use Qtcreate compile for android in windows
- qmake. It may appear that the dependent library could not be found. (Deprecated, please use CMake for new programs)

Don't find D:\Source\build-RabbitCommon-Android_for_armeabi_v7a_Clang_Qt_5_12_4_for_Android_ARMv7-Debug\bin\libRabbitCommon.so
move libRabbitCommon.so ..\bin\libRabbitCommon.so
process_begin: CreateProcess(NULL, move libRabbitCommon.so ..\bin\libRabbitCommon.so, ...) failed.
make (e=2): The system can not find the file specified。
make[1]: [..\bin\libRabbitCommon.so] Error 2 (ignored)

The reason is that the make program under windows cannot convert the \ in the path.
Solution: Use a make program that recognizes the \ in the path, for example: mingw32-make.exe.

- cmake

- Set Generator to "Unix Makefiles"
- Set CMAKE_MAKE_PROGRAM to ${ANDROID_NDK}/prebuilt/windows-x86_64/bin/make.exe

- Install notes:
+ windows
If you build app. Qt does not provide openssl dynamic library for copyright reasons, so you must copy the dynamic library of openssl to the installation directory.
- If it is 32, you can find the dynamic library of openssl (libeay32.dll, ssleay32.dll) in the Qt installer Tools\QtCreator\bin directory.
- If it is 64-bit, you will need to download the binary installation package for openssl yourself.

+ linux

```
sudo apt-get install libssl1.1
```

### Other application use the project

if(NOT RabbitCommon_ROOT)
set(RabbitCommon_ROOT $ENV{RabbitCommon_ROOT})
if(NOT RabbitCommon_ROOT)
set(RabbitCommon_ROOT ${CMAKE_SOURCE_DIR}/../RabbitCommon)
endif()
endif()
if(RabbitCommon_ROOT AND EXISTS ${RabbitCommon_ROOT}/Src)
message("Use RabbitCommon source code")
add_subdirectory(${RabbitCommon_ROOT}/Src ${CMAKE_BINARY_DIR}/RabbitCommon)
else()
find_package(RabbitCommon)
if(NOT RabbitCommon_FOUND)
message("RabbitCommon_ROOT is not found. Please use one of the following ways to set it:")
message("1. Set RabbitCommon_ROOT to the install prefix of RabbitCommon.")
message("2. Set RabbitCommon_ROOT to source code root of RabbitCommon.")
message("2.1 Please download the source code of RabbitCommon from https://github.com/KangLin/RabbitCommon")
message(" ag:")
message(" git clone https://github.com/KangLin/RabbitCommon.git ${CMAKE_SOURCE_DIR}/..")
message("2.2 Then set cmake variable or environment variable RabbitCommon_ROOT to download root directory.")
message(" ag:")
message(" cmake -DRabbitCommon_ROOT=${CMAKE_SOURCE_DIR}/.. ")
message(FATAL_ERROR "RabbitCommon_ROOT isn't set.")
endif()
endif()

- Use in library mode
+ cmake

Set RabbitCommon_ROOT to specify the root directory of the installed RabbitCommon

find_package(RabbitCommon)

- Use the source code directly
+ cmake
- Submodule

add_subdirectory(3th_libs/RabbitCommon/Src)

- No submodule
+ Download RabbitCommon to the same directory of the application

git clone https://github.com/KangLin/RabbitCommon.git

+ Introduced to add_subdirectory this directory

if(NOT RabbitCommon_ROOT)
set(RabbitCommon_ROOT $ENV{RabbitCommon_ROOT})
if(NOT RabbitCommon_ROOT)
set(RabbitCommon_ROOT ${CMAKE_SOURCE_DIR}/../RabbitCommon)
endif()
endif()
if(RabbitCommon_ROOT AND EXISTS ${RabbitCommon_ROOT}/Src)
message("Use RabbitCommon source code")
add_subdirectory(${RabbitCommon_ROOT}/Src ${CMAKE_BINARY_DIR}/RabbitCommon)
else()
find_package(RabbitCommon)
if(NOT RabbitCommon_FOUND)
message("RabbitCommon_ROOT is not found. Please use one of the following ways to set it:")
message("1. Set RabbitCommon_ROOT to the install prefix of RabbitCommon.")
message("2. Set RabbitCommon_ROOT to source code root of RabbitCommon.")
message("2.1 Please download the source code of RabbitCommon from https://github.com/KangLin/RabbitCommon")
message(" ag:")
message(" git clone https://github.com/KangLin/RabbitCommon.git ${CMAKE_SOURCE_DIR}/..")
message("2.2 Then set cmake variable or environment variable RabbitCommon_ROOT to download root directory.")
message(" ag:")
message(" cmake -DRabbitCommon_ROOT=${CMAKE_SOURCE_DIR}/.. ")
message(FATAL_ERROR "RabbitCommon_ROOT isn't set.")
endif()
endif()

+ Add the following code to the CMakeLists.txt file of the project

target_link_libraries(${PROJECT_NAME} RabbitCommon)

- Static library

target_compile_definitions(${PROJECT_NAME} PRIVATE RABBITCOMMON_STATIC_DEFINE)

- Initialization functions is called at the beginning of main() of the program
and after QApplication

int main(int argc, char* argv[])
{
QApplication a(argc, argv);
a.setApplicationName(......);
// Because it depend on QApplication::applicationName()
RabbitCommon::CTools::Instance()->Init();

......
}

### Functions

[Online developer documents](https://kanglin.github.io/RabbitCommon/English/html/group__API.html)

#### [About](Src/DlgAbout/DlgAbout.h)

- Install Authors、 License、 ChangeLog files.
File name naming rules:
Authors.md、License.md、ChangeLog.md is the default file.
The local file naming rule is to add the local name after the default file name.
For example: Chinese file:
Authors_zh_CN.md、License_zh_CN.md、ChangeLog_zh_CN.md

SET(OTHER_FILES
${CMAKE_SOURCE_DIR}/License.md
${CMAKE_SOURCE_DIR}/Authors.md
${CMAKE_SOURCE_DIR}/Authors_zh_CN.md
${CMAKE_SOURCE_DIR}/ChangeLog.md
)
INSTALL_FILE(SOURCES ${OTHER_FILES} DESTINATION "." COMPONENT Runtime)

- Used in code

QApplication a(argc, argv);
a.setApplicationVersion(RabbitCommon_VERSION);
a.setApplicationName("SerialPortAssistant");
a.setApplicationDisplayName(QObject::tr("SerialPortAssistant"));

#ifdef RABBITCOMMON
CDlgAbout about(this);
about.m_AppIcon = QImage(":/icon/SerialPortAssistant");
about.m_szHomePage = "https://github.com/KangLin/SerialPortAssistant";
#if defined (Q_OS_ANDROID)
about.showMaximized();
about.exec();
#else
about.exec();
#endif
#endif

- See: https://github.com/KangLin/SerialPortAssistant

![About](documents/image/about_en.png "About")

#### Updater

See: [FrmUpdater.h](Src/FrmUpdater/FrmUpdater.h)

```
#ifdef RABBITCOMMON
CFrmUpdater *fu = new CFrmUpdater();
fu->SetTitle(QImage(":/image/SerialPortAssistant"), qApp->applicationDisplayName());
#if defined (Q_OS_ANDROID)
fu->showMaximized();
#else
fu->show();
#endif
#endif
```

- Use CFrmUpdater::GenerateUpdateXml() to generate update xml file, use --help look up parameter

./TasksApp --help
Usage: ./TasksApp [options]

Options:
-h, --help Displays this help.
-v, --version Displays version information.
-f, --file xml file name
--pv Package version
-t, --time

- Add Update/update.xml in project source root directory, then add the url to CFrmUpdater::DownloadFile.



v2.3.2

url


url


url


url



- See: https://github.com/KangLin/SerialPortAssistant

![Updater](documents/image/updater_en.png "Updater")

#### Execute the program with administrator privileges

[adminauthoriser.h](Src/AdminAuthoriser/adminauthoriser.h)

- Internal implementation

QString szCmd = "mkdir";
QStringList paras;
paras << "-p" << "/opt/RabbitCommonAdminAuthoriseTest";
qDebug() << "RabbitCommon::AdminAuthoriser::Instance()->execute(szCmd, paras):"
<< RabbitCommon::AdminAuthoriser::Instance()->execute(szCmd, paras);

- Public interface:

RabbitCommon::CTools::executeByRoot("regedit", QStringList());

#### The program starts automatically

[The program starts automatically](Src/RabbitCommonTools.h)

static int InstallStartRun(const QString &szName = QString(),
const QString &szPath = QString(),
bool bAllUser = false);
static int RemoveStartRun(const QString &szName = QString(),
bool bAllUser = false);
static bool IsStartRun(const QString &szName = QString(),
bool bAllUser = false);

#### Get system information
- Get current login user name:

RabbitCommon::CTools::GetCurrentUser();

- Get host name:

RabbitCommon::CTools::GetHostName();

### Other projects using this project

- [Rabbit remote control](https://github.com/KangLin/RabbitRemoteControl)
- [Rabbit IM](https://github.com/KangLin/RabbitCommon)
- [Calendar](https://github.com/KangLin/Calendar)
- [LunarCalendar](https://github.com/KangLin/LunarCalendar)
- [SerialPortAssistant](https://github.com/KangLin/SerialPortAssistant)
- [FaceRecognizer](https://github.com/KangLin/FaceRecognizer)
- [TransformCoordinate](https://github.com/KangLin/TransformCoordinate)
- [Chinese chess control](https://github.com/KangLin/ChineseChessControl)

### Donation

![Donation](Src/Resource/image/Contribute_en.png "Donation")

### License

[License](License.md "License.md")