#include "PicDateItem.h" #include #include #include "LogInfo.h" PicDateItem::PicDateItem(QGraphicsItem *parent, QGraphicsScene *scene, const SourceType type) :PicTextItem(parent, scene, type) { m_timer.setInterval(20); connect(&m_timer, &QTimer::timeout, [this](){ updateDatetimeStr(); }); m_timer.start(); } QVariant PicDateItem::source() { return m_model.datetimePattern; } void PicDateItem::setSource(QVariant var) { m_model.datetimePattern = var.toString(); if(m_model.datetimePattern.isEmpty()) return; m_currDateTimeStr = generateDatetimeStr(QDateTime::currentDateTime()); applyModify(); } void PicDateItem::setModel(DateItemModel model) { m_model = std::move(model); setSource(m_model.datetimePattern); } const DateItemModel& PicDateItem::model() const { return m_model; } bool PicDateItem::updateDatetimeStr() { if (m_model.datetimePattern.isEmpty()) return false; if(m_currDateTimeStr.isEmpty()) { m_currDateTimeStr = generateDatetimeStr(QDateTime::currentDateTime()); applyModify(); return true; } auto now = QDateTime::currentDateTime(); auto str = generateDatetimeStr(now); if(str == m_currDateTimeStr) { return false; } m_currDateTimeStr = str; applyModify(); return true; } void PicDateItem::setCustomAttrs(const QXmlStreamAttributes &attrs) { // 结构类似这样 // weeksMap = "MON
TUR
WED
TUE
THU
FRI
SAT
SUN" // yearsMap = "20232023年
20242024年
20252025年" auto m = DateItemModel(); m.dataMap = attrs.value("dataMap").toString().split("
"); m.daysMap = attrs.value("daysMap").toString().split("
"); m.hoursMap = attrs.value("hoursMap").toString().split("
"); m.monthsMap = attrs.value("monthsMap").toString().split("
"); m.weeksMap = attrs.value("weeksMap").toString().split("
"); auto yearsMap = attrs.value("yearsMap").toString().split("
"); for(auto it = yearsMap.begin(); it != yearsMap.end(); ++it) { auto yearPair = it->split(""); if(yearPair.size() == 2) { m.yearsMap[yearPair[0].toInt()] = yearPair[1]; } } m.monthsOffset = attrs.value("monthsOffset").toInt(); m.daysOffset = attrs.value("daysOffset").toInt(); m.datetimePattern = attrs.value("datetimePattern").toString(); setModel(std::move(m)); } void PicDateItem::saveCustomAttrs(QXmlStreamAttributes &attrs) { auto dataMap = m_model.dataMap.join("
"); auto daysMap = m_model.daysMap.join("
"); auto hoursMap = m_model.hoursMap.join("
"); auto monthsMap = m_model.monthsMap.join("
"); auto weeksMap = m_model.weeksMap.join("
"); QString yearsMap; for(auto it = m_model.yearsMap.begin(); it != m_model.yearsMap.end(); ++it) { yearsMap.append(QString("%1%2
").arg(it.key()).arg(it.value())); } attrs.append("dataMap", dataMap); attrs.append("daysMap", daysMap); attrs.append("hoursMap", hoursMap); attrs.append("monthsMap", monthsMap); attrs.append("weeksMap", weeksMap); attrs.append("yearsMap", yearsMap); attrs.append("datetimePattern", m_model.datetimePattern); attrs.append("monthsOffset", QString::number(m_model.monthsOffset)); attrs.append("daysOffset", QString::number(m_model.daysOffset)); } QImage PicDateItem::itemImage() { if(m_model.datetimePattern.isEmpty()) return QImage(); auto ret = strToImage(m_currDateTimeStr); return ret; } QString PicDateItem::generateDatetimeStr(const QDateTime &datetime) { QString result = m_model.datetimePattern; // 应用偏移量 QDateTime applyDateTime = datetime; if(m_model.monthsOffset != 0) { applyDateTime = datetime.addMonths(m_model.monthsOffset); } else if(m_model.daysOffset != 0) { applyDateTime = datetime.addDays(m_model.daysOffset); } // 使用正则表达式匹配并替换各种格式化模式 // 匹配四位数年份 yyyy int i = result.indexOf("yyyy"); if(i != -1) { int year = applyDateTime.date().year(); QString yearStr = m_model.yearsMap.contains(year) ? m_model.yearsMap[year] : QString::number(year); result.replace(i, 4, yearStr); } // 匹配两位数年份 yy i = result.indexOf("YY"); if(i != -1) { QString yearStr = QString::number(applyDateTime.date().year()).right(2); result.replace(i, 2, yearStr); } // 匹配两位数月份 MM i = result.indexOf("MM"); if(i != -1) { result.replace(i, 2, m_model.monthsMap[applyDateTime.date().month() - 1]); } // 匹配两位数日期 dd i = result.indexOf("dd"); if(i != -1) { result.replace(i, 2, m_model.daysMap[applyDateTime.date().day() - 1]); } // 匹配两位数小时 HH i = result.indexOf("HH"); if(i != -1) { result.replace(i, 2, m_model.hoursMap[applyDateTime.time().hour()]); } // 匹配两位数分钟 mm QRegExp minutePattern("mm"); if (result.contains(minutePattern)) { int minute = applyDateTime.time().minute(); result.replace(minutePattern, QString::number(minute).rightJustified(2, '0')); } // 匹配两位数秒钟 ss QRegExp secondPattern("ss"); if (result.contains(secondPattern)) { int second = applyDateTime.time().second(); result.replace(secondPattern, QString::number(second).rightJustified(2, '0')); } // 格式化周几 w i = result.indexOf("w"); if (i != -1) { result.replace(i, 1, m_model.weeksMap[applyDateTime.date().dayOfWeek() - 1]); } // 格式化年中周数 c QRegExp weekNumberPattern("c"); if (result.contains(weekNumberPattern)) { result.replace(weekNumberPattern, QString::number(applyDateTime.date().weekNumber())); } return result; }