fncalender.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "fncalender.h"
  2. #include "ui_fncalender.h"
  3. FnCalender::FnCalender(QWidget* parent) :
  4. QWidget(parent),
  5. ui(new Ui::FnCalender)
  6. {
  7. ui->setupUi(this);
  8. setMouseTracking(true);
  9. initData();
  10. }
  11. FnCalender::~FnCalender()
  12. {
  13. delete ui;
  14. }
  15. void FnCalender::initData()
  16. {
  17. m_hasInit = false;
  18. m_date = QDate::currentDate();
  19. for (int i = 1900; i <= 2100; i++)
  20. {
  21. ui->cbbYear->addItem(QString("%1年").arg(i), i);
  22. }
  23. ui->cbbYear->setCurrentIndex(m_date.year() - 1900);
  24. for (int i = 1; i <= 12; i++)
  25. {
  26. ui->cbbMonth->addItem(QString("%1月").arg(i), i);
  27. }
  28. ui->cbbMonth->setCurrentIndex(m_date.month() - 1);
  29. m_hasInit = true;
  30. }
  31. QDate FnCalender::date() const
  32. {
  33. return m_date;
  34. }
  35. void FnCalender::setDate(const QDate& date)
  36. {
  37. m_date = date;
  38. }
  39. void FnCalender::changeDate()
  40. {
  41. if (!m_hasInit)
  42. {
  43. return;
  44. }
  45. int y = ui->cbbYear->currentData(Qt::UserRole).toInt();
  46. int m = ui->cbbMonth->currentData(Qt::UserRole).toInt();
  47. m_date = QDate::fromString(QString("%1-%2-1").arg(y).arg(m), "yyyy-M-d");
  48. update();
  49. }
  50. void FnCalender::paintEvent(QPaintEvent* event)
  51. {
  52. QPoint pt = this->cursor().pos();
  53. pt = mapFromGlobal(pt);
  54. QPainter painter;
  55. painter.begin(this);
  56. painter.setPen(Qt::NoPen);
  57. painter.setBrush(Qt::white);
  58. painter.drawRect(rect());
  59. QString weekNames[] = {"一", "二", "三", "四", "五", "六", "日"};
  60. int w = width() / 7;
  61. int h = (height() - 96) / 6;
  62. painter.setPen(Qt::black);
  63. for (int i = 0; i < 7; i++)
  64. {
  65. QRect weekNameRc = QRect(i * w, 48, w, 48);
  66. painter.drawText(weekNameRc, Qt::AlignCenter, weekNames[i]);
  67. }
  68. QDate firstDay = m_date.addDays(-m_date.day() + 1);
  69. int n = firstDay.dayOfWeek() - 1;
  70. qDebug() << n;
  71. int days = m_date.daysInMonth();
  72. int j = 0;
  73. int k = n;
  74. for (int i = 0; i < k; i++)
  75. {
  76. m_dateDatas[i].rc = QRect(i * w, j * h + 96, w, h);
  77. m_dateDatas[i].isNull = true;
  78. m_dateDatas[i].line = 0;
  79. emit drawExtraInfo(painter, m_dateDatas[i]);
  80. }
  81. for (int i = 1; i <= days; i++)
  82. {
  83. QRect dayRc = QRect(n * w, j * h + 96, w, h);
  84. if (dayRc.contains(pt))
  85. {
  86. painter.setBrush(QColor(203, 203, 204));
  87. painter.setPen(Qt::NoPen);
  88. painter.drawRect(dayRc);
  89. painter.setPen(Qt::black);
  90. }
  91. else
  92. {
  93. painter.setPen(Qt::black);
  94. painter.setBrush(Qt::white);
  95. }
  96. QRect textRc = QRect(dayRc.left(), dayRc.top() + 4, dayRc.width(), 24);
  97. painter.drawText(textRc, Qt::AlignCenter, QString("%1").arg(i));
  98. m_dateDatas[k].line = j;
  99. m_dateDatas[k].rc = dayRc;
  100. m_dateDatas[k].date = QDate::fromString(QString("%1-%2-%3").arg(m_date.year()).arg(m_date.month()).arg(i), "yyyy-M-d");
  101. n++;
  102. if (n == 7)
  103. {
  104. j++;
  105. n = 0;
  106. }
  107. emit drawExtraInfo(painter, m_dateDatas[k]);
  108. k++;
  109. }
  110. while (k < 42)
  111. {
  112. QRect dayRc = QRect(n * w, j * h + 96, w, h);
  113. m_dateDatas[k].line = j;
  114. m_dateDatas[k].isNull = true;
  115. m_dateDatas[k].rc = dayRc;
  116. n++;
  117. if (n == 7)
  118. {
  119. j++;
  120. n = 0;
  121. }
  122. emit drawExtraInfo(painter, m_dateDatas[k]);
  123. k++;
  124. }
  125. painter.end();
  126. }
  127. void FnCalender::mouseMoveEvent(QMouseEvent* event)
  128. {
  129. update();
  130. }
  131. void FnCalender::on_btnPreMonth_clicked()
  132. {
  133. if (ui->cbbMonth->currentIndex() - 1 >= 0)
  134. {
  135. ui->cbbMonth->setCurrentIndex(ui->cbbMonth->currentIndex() - 1);
  136. }
  137. else
  138. {
  139. ui->cbbYear->setCurrentIndex(ui->cbbYear->currentIndex() - 1);
  140. ui->cbbMonth->setCurrentIndex(11);
  141. }
  142. changeDate();
  143. }
  144. void FnCalender::on_btnNextMonth_clicked()
  145. {
  146. if (ui->cbbMonth->currentIndex() + 1 <= 11)
  147. {
  148. ui->cbbMonth->setCurrentIndex(ui->cbbMonth->currentIndex() + 1);
  149. }
  150. else
  151. {
  152. ui->cbbYear->setCurrentIndex(ui->cbbYear->currentIndex() + 1);
  153. ui->cbbMonth->setCurrentIndex(0);
  154. }
  155. changeDate();
  156. }
  157. void FnCalender::on_cbbYear_currentIndexChanged(int index)
  158. {
  159. changeDate();
  160. }
  161. void FnCalender::on_cbbMonth_currentIndexChanged(int index)
  162. {
  163. changeDate();
  164. }