农历日历 v1.0.4
载入中...
搜索中...
未找到
农历日历

一个 Qt 界面的农历日历库,支持 QSS (换肤功能),任务显示。

农历日历界面

  • 日历
月视图 周视图
  • 日历头
  • 工具栏和今日按钮
  • 选择日期和当前时间
  • 日历显示
    • 中国节假日,在左上角显示。
    • 上面中间圆点表示任务
    • 中间为阳历
    • 底下为农历、节气或是任务。 农历位置显示类型优先级
      • 节日,放在农历位置上显示。最多显示最前一个。高亮加粗体
      • 节气
      • 周年纪念日、其它任务,在阳历上面中间用圆点表示。如果可能同时放在农历位置显示。
    • 详细提示(ToolTip)

角色定义

  • 开发者(Developer):开发本项目的人员
  • 使用者(User):使用本项目进行二次开发的人员
  • 客户(Client):使用本项目最终程序的人员

任务

任务可分为:

  • 年为周期。例如:节日;周年纪念日
  • 月为周期。例如:中国发工资;还贷款
  • 星期为周期。例如:开会;国外发工资
  • 其它周期性任务。例如:女性月经
  • 非周期性任务。例如:中国节假日(一群闲得蛋疼的人搞出来的玩意)
  • 单个任务

由于任务类型众多,所以本项目任务由使用者自行处理, 参见: 使用者自定义任务接口

节日、周年纪念日(以年为周期的任务)

农历位置显示类型优先级

  • 公历节日
  • 农历节日
  • 节气
  • 周年纪念日
  • 任务
  • 农历

任务接口

使用者自定义任务接口

只需要使用下列方法之一:

  • 使用 CLunarCalendar::SetTaskHandle() 处理自定义任务
    • 声明 CLunarCalendar::CTaskHandler 的派生类
      {
      virtual uint onHandle(/*in*/const QDate& d,
      /*out*/QStringList& tasks) override final;
      };
      [Define CTaskHandler derived class]
      Definition MainWindow.h:16
      使用者自定义任务接口 类
    • 实现 CLunarCalendar::CTaskHandler::onHandle 处理函数
      uint CHandler::onHandle(/*in*/const QDate& d,
      /*out*/QStringList& tasks) {
      // 纪念日(以年为周期)
      if(10 == d.month() && 25 == d.day())
      {
      tasks << "抗美援朝纪念日";
      return 0;
      }
      int lunarYear = 0;
      int lunarMonth = 0;
      int lunarDay = 0;
      CLunarCalendar::GetLunar(d, lunarYear, lunarMonth, lunarDay);
      // 纪念日(以农历年为周期)
      if(8 == lunarMonth && 22 == lunarDay)
      {
      tasks << "结婚纪念日";
      return 0;
      }
      // 以月为周期
      if(21 == d.day())
      {
      // 表示只显示圆点,不显示内容
      return 1;
      }
      // 以周为周期
      if(Qt::Wednesday == d.dayOfWeek())
      {
      // 表示只显示圆点,不显示内容。建议用上面的方式
      tasks << QString();
      return 0;
      }
      // 单个任务
      if(2015 == d.year() && 10 == d.month() && 22 == d.day())
      {
      // 表示只显示圆点,不显示内容
      return 1;
      }
      // 没有任务
      return 0;
      }
      static int GetLunar(const QDate date, int &year, int &month, int &day)
      得到给定日期的农历(公历转农历)
      注意:
      • 处理函数应尽快返回。不要在函数中做过多复杂的处理。防止阻塞 UI 线程。
      • 如果不需要在任务显示在农历位置,则只要返回任务数。不要设置 tasks 参数。
      • 如果需要任务显示在农历位置,则需要设置 tasks 参数。最前面的一个显示。 参见: 农历位置显示类型优先级
    • 定义变量
      QSharedPointer<CHandler> m_Hnadler;
    • 实例化对象
      m_Hnadler = QSharedPointer<CHandler>(new CHandler());
    • CLunarCalendar::SetTaskHandle 设置处理类
      m_pLunarCalendar->SetTaskHandle(m_Hnadler);
  • 使用 CLunarCalendar::SetTaskHandle(std::function<uint(const QDate& date, QStringList& tasks)> cbHandler) 处理自定义任务。 需要标准C++11及以后才支持。

    m_pLunarCalendar->SetTaskHandle([](const QDate& d,
    QStringList& tasks)->uint {
    int lunarYear = 0;
    int lunarMonth = 0;
    int lunarDay = 0;
    CLunarCalendar::GetLunar(d, lunarYear, lunarMonth, lunarDay);
    // 节日(以年为周期)
    if(d.month() == 10 && d.day() == 26)
    {
    tasks << "环卫工人节";
    return 0;
    }
    // 农历节日(以农历年为周期)
    if(9 == lunarMonth && 9 == lunarDay)
    {
    tasks << "老人节" << "老年节" << "登高节" << "踏秋";
    return 0;
    }
    // 纪念日(以年为周期)
    if(d.day() == 10 && d.month() == 10)
    {
    // 表示显示圆点,也显示内容
    tasks << "辛亥革命纪念日";
    return 0;
    }
    // 生日(纪念日:以农历年为周期)
    if(8 == lunarMonth && 23 == lunarDay)
    {
    tasks << "爸生日";
    return 0;
    }
    // 以月为周期
    if(d.day() == 11)
    {
    // 表示只显示圆点,不显示内容
    return 1;
    }
    // 以周为周期
    if(Qt::Monday == d.dayOfWeek())
    {
    // 表示只显示圆点,不显示内容。建议用上面的方式
    tasks << QString();
    return 0;
    }
    // 单个任务
    if(d.day() == 12 && d.month() == 10 && d.year() == 2015)
    {
    // 表示只显示圆点,不显示内容
    return 1;
    }
    // 没有任务
    return 0;});
    m_pLunarCalendar->Update();

注意:

  • 回调函数应尽快返回。不要在回调函数中做过多复杂的处理。防止阻塞 UI 线程。
  • 如果不需要在任务显示在农历位置,则只要返回任务数。不要设置 tasks 参数。
  • 如果需要任务显示在农历位置,则需要设置 tasks 参数。最前面的一个显示。 参见: 农历位置显示类型优先级

文档