mankalas / qcron

Qt cron-like scheduler
MIT License
39 stars 24 forks source link

Qt6 Support add please? #9

Open CHN-STUDENT opened 8 months ago

CHN-STUDENT commented 8 months ago

Hi, i try to use this lib in my project, but i am using qt6, not qt5, could you add qt support?

CHN-STUDENT commented 8 months ago

Finally, I solved the problem on qt6 by modifying CMakeLists.txt and source code qcron.hpp.

cmake_minimum_required(VERSION 3.0)

# Project name.
set(PROJECT qcron)
project(${PROJECT})

set(SOURCE_DIR         ${CMAKE_SOURCE_DIR}/src)
set(ARCHIVE_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/lib)
set(LIBRARY_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/lib)
set(PUBLIC_HEADER_DIR  ${CMAKE_SOURCE_DIR}/include)

if (WIN32)
  set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install)
endif()

set(${PROJECT}_INCLUDE_DIR
  ${SOURCE_DIR} CACHE STRING "${PROJECT} include directory")

# -Wmissing-declarations delete because it would not make Qt Resource
# Files compiles
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wredundant-decls \
-Wcast-align -Wmissing-include-dirs -Wswitch-enum -Wswitch-default \
-Wextra -Wall -Werror -Winvalid-pch -Wredundant-decls -Wformat=2 \
-Wmissing-format-attribute -Wformat-nonliteral")

option(WITH_UNIT_TESTS "enable building unit test executable" OFF)
#option(WITH_BENCHMARK "enable building benchmark executable" OFF)

# Dependencies
set(QT_COMPONENTS Core Test)

# Enable CMake AUTOMOC
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 添加定义 BUILD_QCRON_LIB,用于导出类
add_definitions(-DBUILD_QCRON_LIB)

# Find Qt version
find_package(Qt6 COMPONENTS Core QUIET)
if(Qt6_FOUND)
  message(STATUS "Using Qt6")
  set(QT_VERSION_MAJOR 6)
  find_package(Qt6 COMPONENTS ${QT_COMPONENTS} REQUIRED)
else()
  message(STATUS "Using Qt5")
  set(QT_VERSION_MAJOR 5)
  find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
endif()
# Source
add_subdirectory(src)

if(WITH_UNIT_TESTS)
  enable_testing()
  add_subdirectory(test)
endif()

Without modified qcron.hpp , when try to link my project, it told me the QCron 's signals: activated() not found. So i search this issue on internet, and a Chinese blog told me i need to declarations in the in src to make linking dynamic library correctly.

image

#ifndef _QCRON_HPP
#define _QCRON_HPP
// 定义导入导出宏
#ifdef BUILD_QCRON_LIB
#define QCRON_EXPORT Q_DECL_EXPORT
#else
#define QCRON_EXPORT Q_DECL_IMPORT
#endif

#include <QObject>
#include <QDateTime>
#include "qcronfield.hpp"

class QCRON_EXPORT QCron : public QObject
{
    Q_OBJECT

public:
    QCron();
    QCron(const QString & pattern);
    ~QCron();

    // Accessors.
    bool isValid() const
        { return _is_valid; }

    const QString & error() const
        { return _error; }

    // Features.

    QDateTime next();
    QDateTime next(QDateTime dt);
    void catchUp(QDateTime & dt, EField field, int value);
    bool match(const QDateTime & dt) const;
    void add(QDateTime & dt, EField field, int value);

signals:
    void activated();
    void deactivated();

private:
    bool _is_valid;
    bool _is_active;
    QString _error;
    QCronField _fields[6];

    void _init();
    void _setError(const QString & error);
    void _parsePattern(const QString & pattern);
    void _parseField(QString & field_str,
                     EField field);
    QString _validCharacters(EField field);
    void _process(QDateTime & dt, EField field);

private slots:
    void _checkState();
};

#endif

myproject CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(opcTrans LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Sql)
include_directories("D:/qtproject/myproject/qcron/include")
link_directories("D:/qtproject/myproject/qcron/lib")
add_executable(myproject main.cpp)
target_link_libraries (myproject Qt${QT_VERSION_MAJOR}::Core)
target_link_libraries (myproject QCron)

include(GNUInstallDirs)
install(TARGETS myproject 
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

To use:

    std::unique_ptr<QCron> cron = std::make_unique<QCron>("* * * * * *"); // every 1min
    QObject::connect(cron.get(), &QCron::activated, [&]() {
         qDebug() << "run!" ;
    });

But could you add second parse support, i think it will be useful for us. @mankalas @Lu-Gru