C++,QT实现火爆网络的文字罗盘时钟

山前大桥下,有一个傻瓜。一枚小学生,幽居荒山中。养了一群狗,还有一只猫。喜欢搞编程,缺钱打零工。数理史皆通,法文记心中。下厨会做饭,挥毫能舞文

老规矩,先上图

平滑动画尚未做,后期完善。主要代码如下

头文件主要代码:

protected:
    /// 初始化文字罗盘时钟
    /// \brief InitTextClockCtl
    ///
    void InitTextClockCtl();

    /// 系统绘制事件
    /// \brief paintEvent
    ///
    void paintEvent(QPaintEvent *);

    /// 绘制背景
    /// \brief DrawsBackgrounds
    /// \param painter
    ///
    void DrawsBackgrounds(QPainter *painter);

    /// 绘制刻度
    /// \brief DrawAnglesValues
    /// \param painter
    ///
    void DrawAnglesValues(QPainter *painter);

    /// 绘制时间线
    /// \brief DrawTimeLineItem
    /// \param painter
    ///
    void DrawTimeLineItem(QPainter *painter);

    /// 绘制中心年份
    /// \brief DrawCentersItems
    /// \param painter
    /// \param date
    ///
    void DrawCentersItems(QPainter *painter,const QDate date);

    /// 绘制月份
    /// \brief DrawMonthPointer
    /// \param painter
    /// \param date
    ///
    void DrawMonthPointer(QPainter *painter,const QDate date);

    /// 绘制日期
    /// \brief DrawDaysPointers
    /// \param painter
    /// \param date
    ///
    void DrawDaysPointers(QPainter *painter,const QDate date);

    /// 绘制时针数据
    /// \brief DrawHourPointers
    /// \param painter
    /// \param time
    ///
    void DrawHourPointers(QPainter *painter,const QTime time);

    /// 绘制分针数据
    /// \brief DrawMinutPointer
    /// \param painter
    /// \param time
    ///
    void DrawMinutPointer(QPainter *painter,const QTime time);

    /// 绘制秒针数据
    /// \brief DrawSecsPointers
    /// \param painter
    /// \param time
    ///
    void DrawSecsPointers(QPainter *painter,const QTime time);

  private:
    LNCFQTEXTCLOCK_DATAS   tDashboardData;     //时钟控件数据结构变量
    Lncf_LunarCalendarInfo tLunarCalendar;     //农历信息变量
    LNCFQT_LUNARCAL_INFO   tLunarDateInfo;     //当前日农历信息
    QTimer                *pTextColckTime = nullptr;
    QFont                  pClockTextFont;     //文字字体

    QList<std::u16string>  sMonthTextList;     //月份字符串列表,长度为12
    QList<std::u16string>  sDaysTextsList;     //日期字符串列表,长度为31
    QList<std::u16string>  sHourTextsList;     //时针字符串列表,长度为24
    QList<std::u16string>  sMinuteTxtList;     //分针字符串列表,长度为60
    QList<std::u16string>  sSecondTxtList;     //秒针字符串列表,长度为60

    QList<std::u16string>  sLunarHourText;     //农历时针字符串列表,长度为12
    QList<std::u16string>  sLunarMinutTxt;     //农历时刻字符串列表,长度为8

    QDate                  pCurrentsDates;     //当前日期索引
  private:

主要绘制源代码:

/// 系统绘制事件
  /// \brief paintEvent
  ///
  void Lncf_QtTextClocked::paintEvent(QPaintEvent *event)
  {
    int width = this->width();
    int height = this->height();
    int side = qMin(width, height);

    //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.translate(width / 2, height / 2);
    painter.scale(side / 200.0, side / 200.0);

    //绘制背景
    if(this->tDashboardData.bHasShowBkgClr)
      DrawsBackgrounds(&painter);

    //绘制刻度
    if(this->tDashboardData.bShowAngleItem)
      DrawAnglesValues(&painter);

    //绘制时间线
    if(this->tDashboardData.bShowsTimeLine)
      DrawTimeLineItem(&painter);

    QTime time = QTime::currentTime();
    QDate date = QDate::currentDate();

    if(this->pCurrentsDates!=date){
        this->pCurrentsDates=date;
        this->tLunarCalendar.GetLunarCalendars(pCurrentsDates.year(),pCurrentsDates.month(),pCurrentsDates.day(),this->tLunarDateInfo);
      }

    //绘制重心年份
    DrawCentersItems(&painter,date);

    //绘制月份
    DrawMonthPointer(&painter,date);

    //绘制日期
    DrawDaysPointers(&painter,date);

    //绘制时针
    DrawHourPointers(&painter,time);

    //绘制分针
    DrawMinutPointer(&painter,time);

    //绘制秒针
    DrawSecsPointers(&painter,time);

  }

  /// 绘制背景
  /// \brief DrawsBackgrounds
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawsBackgrounds(QPainter *painter)
  {
    painter->save();
    painter->setPen(Qt::NoPen);
    int radius = 99;

    if(this->tDashboardData.cBackgroundArr.count()>0)
      {
        QConicalGradient coneGradient(0, 0, 180.0);
        int sCount=tDashboardData.cBackgroundArr.count();
        for(int s=0;s<sCount;s++){
            coneGradient.setColorAt(tDashboardData.cBackgroundArr[s].fBkgndAngleVal,tDashboardData.cBackgroundArr[s].cBkgndAngleClr);
          }
        painter->setBrush(coneGradient);
      }
    else{
        painter->setBrush(this->tDashboardData.cBackgroundClr);
      }

    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();

    painter->save();
    painter->setBrush(Qt::NoBrush);
    QPen pen;
    pen.setColor(this->tDashboardData.cBorderClrsVal);
    radius = 96;
    pen.setWidthF(6);
    painter->setPen(pen);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();

    painter->save();
    radius = 93;
    pen.setWidthF(0.25);
    painter->setPen(pen);
    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
  }

  /// 绘制刻度
  /// \brief DrawAnglesValues
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawAnglesValues(QPainter *painter)
  {
    int radius1 = 98,radius2=94;
    painter->save();
    QPen pen;
    pen.setCapStyle(Qt::RoundCap);
    for (int i = 0; i < 360; i++)
      {
        if(i%10==0){
            pen.setColor(this->tDashboardData.cCurrSecondClr);
            pen.setWidthF(0.3);
            painter->setPen(pen);
            painter->drawLine(0, radius2+(radius1-radius2)*0.6, 0, radius1);
          }
        else{
            pen.setColor(tDashboardData.cAngleLineClrs);
            pen.setWidthF(0.25);
            painter->setPen(pen);
            painter->drawLine(0, radius2+(radius1-radius2)*0.9, 0,  radius1);
          }
        painter->rotate(1);
      }

    QFont font;
    int offset = 0;
    font.setPixelSize((radius1-radius2)*3.0/6.0);
    painter->setFont(font);
    painter->setPen(tDashboardData.cAngleTxtColor);
    qreal offsetVal=(radius1-radius2);
    QRectF rect(-radius1+offsetVal / 2, -radius1+offsetVal / 2, radius1 * 2 - offsetVal, radius1 * 2 - offsetVal);
    //QRectF rect(-radius + 2 / 2, -radius + 2 / 2, radius * 2 - 2, radius * 2 - 2);

    for (int i = 0; i < 36; i++) {
        QString text = QString("%1").arg((i+1))+"0";
#if (QT_VERSION < QT_VERSION_CHECK(5,11,0))
        double textWidth =  painter->fontMetrics().width(text);
        double textHeight = painter->fontMetrics().height();
#else
        double textWidth =  painter->fontMetrics().horizontalAdvance(text);
        double textHeight = painter->fontMetrics().height();
#endif

        painter->rotate(10);

        QRectF titleRect(-textWidth / 2, -rect.height() / 2 + offset, textWidth, textHeight);
        painter->drawText(titleRect, Qt::AlignCenter, text);
      }
    painter->restore();
  }

  /// 绘制时间线
  /// \brief Lncf_QtTextClocked::DrawTimeLineItem
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawTimeLineItem(QPainter *painter)
  {
    painter->save();
    QPen pen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cTimeLineColor);
    pen.setWidthF(0.2);
    painter->setPen(pen);
    painter->setBrush(Qt::NoBrush);
    painter->drawLine(0,3,92,3);
    painter->restore();
  }

  /// 绘制中心年份
  /// \brief DrawCentersItems
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawCentersItems(QPainter *painter,const QDate date)
  {
    //绘制年份
    painter->save();

    painter->setPen(Qt::NoPen);
    if(this->tDashboardData.bHasShowBkgClr){
        painter->setBrush(this->tDashboardData.cYearBkgColors);
        painter->drawEllipse(-14, -14, 14 * 2, 14 * 2);
      }

    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dYearsFontSize);
    painter->setFont(font);

    QString sYear = tLunarDateInfo.szLunarYear;
    sYear+="-["+tLunarDateInfo.szZodiacTag+"]";
    sYear+=QString::fromStdU16String(u"年");
    painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cYearTagColors);
    painter->drawText(QRectF(-15,-6.5,30,10),Qt::AlignCenter,sYear);

    font.setPixelSize(this->tDashboardData.dWeekFontsSize);
    painter->setFont(font);
    painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cCurrSecondClr);
    painter->drawText(QRectF(-15,2,30,10),Qt::AlignCenter,date.toString("dddd"));
    painter->restore();
  }

  /// 绘制月份
  /// \brief DrawMonthPointer
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawMonthPointer(QPainter *painter,const QDate date)
  {
    painter->save();
    //绘制月份
    int month=date.month();
    int radius = 13;

    painter->setBrush(Qt::NoBrush);
    if(this->tDashboardData.bHasShowBkgClr){
        QPen pen;
        pen.setColor(this->tDashboardData.cMonthBkgColor);
        pen.setWidthF(13);
        painter->setPen(pen);
        painter->drawEllipse(-21, -21, 21 * 2, 21 * 2);
      }


    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dMonthFontSize);
    painter->setFont(font);
    for(int i=12;i>0;i--)
      {
        if(i==12)
          {
            painter->save();
            painter->setPen(tDashboardData.cCurrMonColors);
            QString sMonth = "["+tLunarDateInfo.szLunarMonthTag+"]-";
            sMonth+=QString::fromStdU16String(sMonthTextList.at(--month));
            painter->drawText(QRectF(radius,-1.5,20,5),Qt::AlignHorizontal_Mask,sMonth);
            painter->restore();
          }
        else{
            painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMonthTagColor);
            painter->drawText(QRectF(radius,-2.5,14,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sMonthTextList.at(--month)));
          }
        if(month==0)
          month=sMonthTextList.count();
        painter->rotate(30.0);
      }
    painter->restore();
  }

  /// 绘制日期
  /// \brief DrawDaysPointers
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawDaysPointers(QPainter *painter,const QDate date)
  {
    painter->save();
    //绘制日期
    int day=date.day();
    int radius = 27;

    painter->setBrush(Qt::NoBrush);
    if(this->tDashboardData.bHasShowBkgClr){
        QPen pen;
        pen.setColor(this->tDashboardData.cDaysBkgColors);
        pen.setWidthF(16);
        painter->setPen(pen);
        painter->drawEllipse(-35, -35, 35 * 2, 35 * 2);
      }

    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dDaysFontsSize);
    painter->setFont(font);
    for(int i=date.daysInMonth();i>0;i--)
      {
        if(i==date.daysInMonth())
          {
            painter->save();
            painter->setPen(this->tDashboardData.cCurrDaysColor);
            QString sDays = "["+tLunarDateInfo.szLunarDaysTag+"]-";
            sDays+=QString::fromStdU16String(sDaysTextsList.at(--day));
            painter->drawText(QRectF(radius+1,-0.75,18,5),Qt::AlignHorizontal_Mask,sDays);
            painter->restore();
          }
        else{
            painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cDaysTagColors);
            painter->drawText(QRectF(radius,-2.5,14,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sDaysTextsList.at(--day)));
          }
        if(day==0)
          day=date.daysInMonth();
        painter->rotate(360.0/date.daysInMonth());
      }
    painter->restore();
  }

  /// 绘制时针数据
  /// \brief DrawHourPointers
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawHourPointers(QPainter *painter,const QTime time)
  {
    painter->save();
    //绘制时针
    int hour=time.hour();
    int radius = 43;

    painter->setBrush(Qt::NoBrush);
    if(this->tDashboardData.bHasShowBkgClr){
        QPen pen;
        pen.setColor(this->tDashboardData.cHoursBkgColor);
        pen.setWidthF(18);
        painter->setPen(pen);
        painter->drawEllipse(-52, -52, 52 * 2, 52 * 2);
      }

    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dHoursFontSize);
    painter->setFont(font);
    //QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cHoursTagColor;
    for(int i=24;i>0;i--)
      {
        if(i==24)
          {
            painter->save();
            painter->setPen(this->tDashboardData.cCurrHourColor);
            QString sHour = "["+QString::fromStdU16String(GetLunarHoursVal(hour))+"]-";
            sHour+=QString::fromStdU16String(sHourTextsList.at(hour));
            painter->drawText(QRectF(radius+3.5,-1.5,18,5),Qt::AlignHorizontal_Mask,sHour);
            painter->restore();
          }
        else{
            painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cHoursTagColor);
            painter->drawText(QRectF(radius,-2.5,17,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sHourTextsList.at(hour)));
          }
        if(hour==0)
          hour=this->sHourTextsList.count();
        painter->rotate(15.0);
        hour-=1;
      }
    painter->restore();
  }

  /// 绘制分针数据
  /// \brief DrawMinutPointer
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawMinutPointer(QPainter *painter,const QTime time)
  {
    painter->save();
    //绘制分针
    int minute=time.minute();
    int radius = 61;

    painter->setBrush(Qt::NoBrush);
    if(this->tDashboardData.bHasShowBkgClr){
        QPen pen;
        pen.setColor(this->tDashboardData.cMinuteBkgClrs);
        pen.setWidthF(16);
        painter->setPen(pen);
        painter->drawEllipse(-69, -69, 69 * 2, 69 * 2);
      }

    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dMinutFontSize);
    painter->setFont(font);
    //QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMinuteTagClrs;
    for(int i=60;i>0;i--)
      {
        if(i==60)
          {
            painter->save();
            painter->setPen(tDashboardData.cCurrMinuteClr);
            QString sMinute = "["+QString::fromStdU16String(GetLunarMinutVal(time.hour(),minute))+"]-";
            sMinute+=QString::fromStdU16String(sMinuteTxtList.at(minute));
            painter->drawText(QRectF(radius+1,-0.75,17,5),Qt::AlignHorizontal_Mask,sMinute);
            painter->restore();
          }
        else{
            painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMinuteTagClrs);
            painter->drawText(QRectF(radius,-2.5,15,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sMinuteTxtList.at(minute)));
          }
        painter->rotate(6.0);
        if(minute==0)
          minute=this->sMinuteTxtList.count();
        minute-=1;
      }
    painter->restore();
  }

  /// 绘制秒针数据
  /// \brief DrawSecsPointers
  /// \param painter
  ///
  void Lncf_QtTextClocked::DrawSecsPointers(QPainter *painter,const QTime time)
  {
    int second=time.second();
    int radius = 77;
    painter->save();

    painter->setBrush(Qt::NoBrush);
    if(this->tDashboardData.bHasShowBkgClr){
        QPen pen;
        pen.setColor(this->tDashboardData.cSecondBkgClrs);
        pen.setWidthF(16);
        painter->setPen(pen);
        painter->drawEllipse(-85, -85, 85 * 2, 85 * 2);
      }

    QFont font =this->pClockTextFont;
    font.setPixelSize(this->tDashboardData.dSecsFontsSize);
    painter->setFont(font);
    //QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cSecondTagClrs;
    for(int i=60;i>0;i--)
      {
        if(i==60)
          {
            painter->save();
            painter->setPen(this->tDashboardData.cCurrSecondClr);
            painter->drawText(QRectF(radius,-1.5,15,4),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sSecondTxtList.at(second)));
            painter->restore();
          }
        else{
            painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cSecondTagClrs);
            painter->drawText(QRectF(radius,-2.5,15,4),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sSecondTxtList.at(second)));
          }
        painter->rotate(6.0);
        if(second==0)
          second=this->sSecondTxtList.count();
        second-=1;
      }
    painter->restore();
  }

有关详细信息,请加QQ群:717743458。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值