#include "DateSlidePickerBox.h" #include #include #include DateSlidePickerBox::DateSlidePickerBox(QWidget *parent) : QWidget(parent) , mLayout(new QHBoxLayout(this)) , mHundredYearBox(new SlidePickerBox(this)) , mTenYearBox(new SlidePickerBox(this)) , mYearBox(new SlidePickerBox(this)) , mMonthBox(new SlidePickerBox(this)) , mDayBox(new SlidePickerBox(this)) { initBox(mHundredYearBox, {"19", "20"}, 56); QStringList tenYearValues{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; initBox(mTenYearBox, tenYearValues); initBox(mYearBox, tenYearValues); addSplitLabel(); QStringList monthValues{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; initBox(mMonthBox, monthValues, 56); addSplitLabel(); QStringList days(monthValues); for (int i = 13; i <= 31; i++) { days << QString("%1").arg(i, 2); } initBox(mDayBox, days, 56); mBigMonthList.append({"01", "03", "05", "07", "08", "10", "12"}); } void DateSlidePickerBox::addSplitLabel() { QLabel* splitLabel = new QLabel(this); splitLabel->setText("/"); splitLabel->setAlignment(Qt::AlignCenter); splitLabel->setFixedWidth(50); splitLabel->setObjectName("sliderSpliterLabel"); mLayout->addWidget(splitLabel); } void DateSlidePickerBox::initBox(SlidePickerBox* aBox, const QStringList& aItemsValues, int width) { aBox->setItems(aItemsValues); mLayout->addWidget(aBox); aBox->setFixedWidth(width); connect(aBox, &SlidePickerBox::valueChanged, this, &DateSlidePickerBox::leapYearAndFebruaryAdjust); } void DateSlidePickerBox::resizeLabel() { mHundredYearBox->resizeLabelWidth(); mTenYearBox->resizeLabelWidth(); mYearBox->resizeLabelWidth(); mMonthBox->resizeLabelWidth(); mDayBox->resizeLabelWidth(); } QString DateSlidePickerBox::getSelectedValue() const{ return QString("%1%2%3-%4-%5").arg(mHundredYearBox->getSelectedValue()). arg(mTenYearBox->getSelectedValue()).arg(mYearBox->getSelectedValue()) .arg(mMonthBox->getSelectedValue()).arg(mDayBox->getSelectedValue()); } void DateSlidePickerBox::setSelectedValue(const QString &val) { mHundredYearBox->setSelectedValue(val.left(2)); mTenYearBox->setSelectedValue(val.left(3).right(1)); mYearBox->setSelectedValue(val.left(4).right(1)); QStringList splitList = val.split('-'); if (splitList.length()<3) return; mMonthBox->setSelectedValue(splitList[1]); mDayBox->setSelectedValue(splitList[2]); } int DateSlidePickerBox::getYear() { return QString("%1%2%3").arg(mHundredYearBox->getSelectedValue()). arg(mTenYearBox->getSelectedValue()).arg(mYearBox->getSelectedValue()).toInt(); } void DateSlidePickerBox::leapYearAndFebruaryAdjust() { QString d = mDayBox->getSelectedValue(); //闰年且二月 if (QDate::isLeapYear(getYear()) && mMonthBox->getSelectedValue() == "02") { //seq is important, must enable item firstly mDayBox->enableItem("29"); if (d.toInt() > 29) { mDayBox->setSelectedValue("29"); } mDayBox->disableItem("30"); mDayBox->disableItem("31"); } //普通年份2月或其他月份 else{ //普通年份2月 if (mMonthBox->getSelectedValue() == "02") { //seq is important, must set selected value firstly if (d.toInt() > 28) { mDayBox->setSelectedValue("28"); } mDayBox->disableItem("29"); mDayBox->disableItem("30"); mDayBox->disableItem("31"); } //其他月份 else{ mDayBox->enableItem("29"); mDayBox->enableItem("30"); if (isBigMonth()){ mDayBox->enableItem("31"); } else{ //seq is important, must set selected value firstly if (d == "31") { mDayBox->setSelectedValue("30"); } mDayBox->disableItem("31"); } } } } bool DateSlidePickerBox::isBigMonth() const { return mBigMonthList.contains(mMonthBox->getSelectedValue()); }