diff --git a/src/components/DateSlidePickerBox.cpp b/src/components/DateSlidePickerBox.cpp index 7e21a73..4a0ed7a 100644 --- a/src/components/DateSlidePickerBox.cpp +++ b/src/components/DateSlidePickerBox.cpp @@ -6,147 +6,123 @@ #include #include #include -DateSlidePickerBox::DateSlidePickerBox(QWidget *parent):QWidget(parent) { - layout = new QHBoxLayout(this); - myear = new SlidePickerBox(this); - QStringList centry; - centry<<"19"<<"20"; - myear->setFixedWidth(56); - myear->setItems(centry); - layout->addWidget(myear); +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); - tyear = new SlidePickerBox(this); - QStringList m_centry; - m_centry << "0" << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "8" << "9"; - tyear->setItems(m_centry); - tyear->setFixedWidth(50); - layout->addWidget(tyear); + QStringList tenYearValues{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; + initBox(mTenYearBox, tenYearValues); + initBox(mYearBox, tenYearValues); - year = new SlidePickerBox(this); - year->setItems(m_centry); - year->setFixedWidth(50); - layout->addWidget(year); + addSplitLabel(); - QLabel* label = new QLabel(this); - label->setText("/"); -// label->setFixedHeight(110); - label->setAlignment(Qt::AlignCenter); + QStringList monthValues{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; + initBox(mMonthBox, monthValues, 56); - label->setFixedWidth(50); - label->setObjectName("sliderSpliterLabel"); - layout->addWidget(label); + addSplitLabel(); - - month = new SlidePickerBox(this); - QStringList m_mouth; - m_mouth << "01" << "02" << "03" << "04" << "05" << "06" << "07" << "08" << "09"<<"10"<<"11"<<"12"; - month->setItems(m_mouth); - month->setFixedWidth(56); - layout->addWidget(month); - - QLabel* label2 = new QLabel(this); - label2->setText("/"); -// label2->setFixedHeight(110); - label2->setAlignment(Qt::AlignCenter); -// label2->setFixedHeight(80); - label2->setFixedWidth(50); - label2->setObjectName("sliderSpliterLabel"); - - layout->addWidget(label2); - - day = new SlidePickerBox(this); - QStringList days; - days << "01" << "02" << "03" << "04" << "05" << "06" << "07" << "08" << "09"; - - for (int i=10;i<=31;i++){ - days<setFixedWidth(56); - day->setItems(days); - layout->addWidget(day); + initBox(mDayBox, days, 56); - bigMonth << "01" << "03" << "05" << "07" << "08" << "10" << "12"; - connect(myear,&SlidePickerBox::valueChanged,this,&DateSlidePickerBox::leapYearAndFebruaryAdjust); - connect(tyear,&SlidePickerBox::valueChanged,this,&DateSlidePickerBox::leapYearAndFebruaryAdjust); - connect(year,&SlidePickerBox::valueChanged,this,&DateSlidePickerBox::leapYearAndFebruaryAdjust); - connect(month,&SlidePickerBox::valueChanged,this,&DateSlidePickerBox::leapYearAndFebruaryAdjust); + 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() { - - myear->resizeLabelWidth(); - tyear->resizeLabelWidth(); - year->resizeLabelWidth(); - month->resizeLabelWidth(); - day->resizeLabelWidth(); + mHundredYearBox->resizeLabelWidth(); + mTenYearBox->resizeLabelWidth(); + mYearBox->resizeLabelWidth(); + mMonthBox->resizeLabelWidth(); + mDayBox->resizeLabelWidth(); } -QString DateSlidePickerBox::getSelectedValue() { - return QString("%1%2%3-%4-%5").arg(myear->getSelectedValue()). - arg(tyear->getSelectedValue()).arg(year->getSelectedValue()) - .arg(month->getSelectedValue()).arg(day->getSelectedValue()); +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) { - myear->setSelectedValue(val.left(2)); - tyear->setSelectedValue(val.left(3).right(1)); - year->setSelectedValue(val.left(4).right(1)); - QStringList sary = val.split('-'); - month->setSelectedValue(sary[1]); - day->setSelectedValue(sary[2]); + mHundredYearBox->setSelectedValue(val.left(2)); + mTenYearBox->setSelectedValue(val.left(3).right(1)); + mYearBox->setSelectedValue(val.left(4).right(1)); + QStringList splitList = val.split('-'); + mMonthBox->setSelectedValue(splitList[1]); + mDayBox->setSelectedValue(splitList[2]); } int DateSlidePickerBox::getYear() { - return QString("%1%2%3").arg(myear->getSelectedValue()). - arg(tyear->getSelectedValue()).arg(year->getSelectedValue()).toInt(); - + return QString("%1%2%3").arg(mHundredYearBox->getSelectedValue()). + arg(mTenYearBox->getSelectedValue()).arg(mYearBox->getSelectedValue()).toInt(); } void DateSlidePickerBox::leapYearAndFebruaryAdjust() { - QString d = day->getSelectedValue(); + QString d = mDayBox->getSelectedValue(); //闰年且二月 - if (QDate::isLeapYear(getYear()) && month->getSelectedValue() == "02") { + if (QDate::isLeapYear(getYear()) && mMonthBox->getSelectedValue() == "02") { //seq is important, must enable item firstly - day->enableItem("29"); + mDayBox->enableItem("29"); if (d.toInt() > 29) { - day->setSelectedValue("29"); + mDayBox->setSelectedValue("29"); } - day->disableItem("30"); - day->disableItem("31"); + mDayBox->disableItem("30"); + mDayBox->disableItem("31"); } //普通年份2月或其他月份 else{ //普通年份2月 - if (month->getSelectedValue() == "02") { + if (mMonthBox->getSelectedValue() == "02") { //seq is important, must set selected value firstly if (d.toInt() > 28) { - day->setSelectedValue("28"); + mDayBox->setSelectedValue("28"); } - day->disableItem("29"); - day->disableItem("30"); - day->disableItem("31"); + mDayBox->disableItem("29"); + mDayBox->disableItem("30"); + mDayBox->disableItem("31"); } //其他月份 else{ - - day->enableItem("29"); - day->enableItem("30"); + mDayBox->enableItem("29"); + mDayBox->enableItem("30"); if (isBigMonth()){ - day->enableItem("31"); + mDayBox->enableItem("31"); } else{ //seq is important, must set selected value firstly if (d == "31") { - day->setSelectedValue("30"); + mDayBox->setSelectedValue("30"); } - day->disableItem("31"); + mDayBox->disableItem("31"); } } } -// day->setSelectedValue(d); } -bool DateSlidePickerBox::isBigMonth() { - return bigMonth.contains(month->getSelectedValue()); +bool DateSlidePickerBox::isBigMonth() const { + return mBigMonthList.contains(mMonthBox->getSelectedValue()); } diff --git a/src/components/DateSlidePickerBox.h b/src/components/DateSlidePickerBox.h index 12492f1..d6291a6 100644 --- a/src/components/DateSlidePickerBox.h +++ b/src/components/DateSlidePickerBox.h @@ -8,26 +8,32 @@ #include #include "SlidePickerBox.h" #include + class QHBoxLayout; + class DateSlidePickerBox:public QWidget { Q_OBJECT public: explicit DateSlidePickerBox(QWidget *parent = nullptr); - QString getSelectedValue(); + QString getSelectedValue() const; void setSelectedValue(const QString& val); void resizeLabel(); - SlidePickerBox* myear; - SlidePickerBox* tyear; - SlidePickerBox* year; - SlidePickerBox* month; - SlidePickerBox* day; + public Q_SLOTS: void leapYearAndFebruaryAdjust(); private: int getYear(); - QStringList bigMonth; - bool isBigMonth(); - QHBoxLayout* layout; + QStringList mBigMonthList; + bool isBigMonth() const; + QHBoxLayout* mLayout; + SlidePickerBox* mHundredYearBox; + SlidePickerBox* mTenYearBox; + SlidePickerBox* mYearBox; + SlidePickerBox* mMonthBox; + SlidePickerBox* mDayBox; + void initBox(SlidePickerBox* aBox, const QStringList& aItemsValues, int width = 50); + + void addSplitLabel(); };