Example #1
0
void TodoList::paintEvent(QPaintEvent *){
    QPainter painter;
    painter.begin(this);

    if(state == WINSTATE::LIST){        
        //标题名称的临时变量
        char temp[128];
        string text;
        text += "<  ";
        int viewYear = viewDate.year;
        int viewMonth = viewDate.month;

        string viewType = "全部";
        string nullText = "出去玩吧 ≥▽≤";
        if(viewState == VIEWSTATE::UNDONE){
            viewType = "未完成";
            nullText = "出去玩吧 ^o^";
        }else{
            if(viewState == VIEWSTATE::WARN){
                viewType = "提醒";
                nullText = "没有提醒 ~";
            }
        }

        sprintf(temp,"%d/%.2d - %s",viewYear,viewMonth,viewType.c_str());
        text += temp;
        text += "  >";

        ui->titleBox->setText(QString::fromStdString(text));


        int posX = 16,posY = 60;
        posY += moveY;
        int paintX = 0,paintY = 0;

        //用于显示具体日期,这里将同一天的事件归为一类
        int lastDay = 0;

        bool haveTodo = false;
        bool first = true;
        indexSize = 0;
        int todoSize = pa.GetListSize(viewYear,viewMonth);

        QDateTime qDateTime = QDateTime::currentDateTime();
        QDate qDate= qDateTime.date();
        QTime qTime = qDateTime.time();
        Date nowDate(qDate.year(),qDate.month(),qDate.day(),qTime.hour(),qTime.minute(),qTime.second());

        for(int i=0;i<todoSize;i++){

          paintX = indexPosX[indexSize];
          TodoItem &item = pa.GetItem(i,viewYear,viewMonth);
          Date date = item.GetTime();

          if(viewState == VIEWSTATE::UNDONE){
              if(item.HaveDone())continue;
          }else if(viewState == VIEWSTATE::WARN){
              int warnTime = item.GetWarnTime();
              if(warnTime == 0 || date.GetTime() - nowDate.GetTime() > warnTime){
                  continue;
              }
          }
          //if(date.month != viewMonth || date.year != viewYear)continue;

          haveTodo = true;

          if(date.day != lastDay){
              lastDay = date.day;
              //优化渲染效率
              if(posY + 59 +paintY + 50 > 0){
                  //绘制时间文字
                  painter.setPen(QPen(Qt::gray));
                  painter.setFont(sFont);
                  char dateText[128];
                  static string weekStr[7] = {"日","一","二","三","四","五","六"};
                  sprintf(dateText,"%d年%.2d月%.2d日 星期%s   +",date.year,date.month,date.day,weekStr[date.GetWeek()].c_str());
                  painter.drawText(posX + 80 + paintX,posY - 21 + paintY,343,70,Qt::AlignBottom,QString::fromStdString(dateText));
                  painter.setPen(QPen(Qt::black));

                  if(!first)painter.drawPixmap(posX + 26,posY - 40 + paintY,8,60,line);//圆圈上方线条


                  painter.drawPixmap(posX + 9 + paintX,posY + 20 + paintY,40,40,circle);
                  char dayText[4];
                  sprintf(dayText,"%.2d",date.day);
                  painter.drawText(posX + 16 + paintX,posY + 14 + paintY,40,40,Qt::AlignBottom,QString::fromStdString(dayText));

                  painter.drawPixmap(posX + 26,posY + 59 + paintY,8,50,line); //圆圈下方线条
              }

              first = false;

              if(indexSize < 128)indexID[indexSize ++] = -1;

              paintY += 80;
          }

          paintX = indexPosX[indexSize];

          if(posY - 26 + paintY + 70 > 0){
              //绘制圆点上下直线
              painter.drawPixmap(posX + 26,posY + 20 + paintY,8,10,line);//圆点上方
              painter.drawPixmap(posX + 26,posY + 36 + paintY,8,65,line);//圆点下方
              //Todo框
              painter.drawPixmap(posX + 23 + paintX,posY + paintY,343,70,boxes[item.GetLevel()]);

              //勾Todo Havedone
              if(item.HaveDone())
                  painter.drawPixmap(posX + 68 + paintX,posY + paintY + 22,25,25,checkPic);

              //绘制Todo名称
              painter.setPen(QPen(Qt::black));
              painter.setFont(font);
              painter.drawText(posX + 113 + paintX,posY - 21 + paintY,343,70,Qt::AlignBottom,QString::fromStdString(item.GetName()));

              //左侧Todo时间
              painter.setPen(QPen(Qt::gray));
              painter.setFont(dateFont);
              char dateText[16];
              sprintf(dateText,"%.2d:%.2d",date.hour,date.minute);
              painter.drawText(posX - 12 + paintX,posY - 26 + paintY,343,70,Qt::AlignBottom,QString::fromStdString(dateText));
          }

          if(indexSize < 128)indexID[indexSize ++] = i; //记录对应todo的id号

          paintY += 80;
          //强行停止渲染
          if(posY + 20 + paintY > 600)break;
        }

        lastDateY = -(paintY);

        if(!haveTodo){
            painter.setPen(QPen(Qt::gray));
            painter.setFont(font);
            painter.drawText(posX + 100,posY - 21,400,70,Qt::AlignBottom,QString::fromStdString(nullText));
        }

    }
    painter.end();
}