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(); }