Refactor DateSlidePickerBox.

This commit is contained in:
Krad
2022-06-07 15:18:33 +08:00
parent 2892e4e181
commit 5c218f6ca3
2 changed files with 87 additions and 105 deletions

View File

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

View File

@@ -8,26 +8,32 @@
#include <QWidget> #include <QWidget>
#include "SlidePickerBox.h" #include "SlidePickerBox.h"
#include <QDate> #include <QDate>
class QHBoxLayout; class QHBoxLayout;
class DateSlidePickerBox:public QWidget { class DateSlidePickerBox:public QWidget {
Q_OBJECT Q_OBJECT
public: public:
explicit DateSlidePickerBox(QWidget *parent = nullptr); explicit DateSlidePickerBox(QWidget *parent = nullptr);
QString getSelectedValue(); QString getSelectedValue() const;
void setSelectedValue(const QString& val); void setSelectedValue(const QString& val);
void resizeLabel(); void resizeLabel();
SlidePickerBox* myear;
SlidePickerBox* tyear;
SlidePickerBox* year;
SlidePickerBox* month;
SlidePickerBox* day;
public Q_SLOTS: public Q_SLOTS:
void leapYearAndFebruaryAdjust(); void leapYearAndFebruaryAdjust();
private: private:
int getYear(); int getYear();
QStringList bigMonth; QStringList mBigMonthList;
bool isBigMonth(); bool isBigMonth() const;
QHBoxLayout* layout; QHBoxLayout* mLayout;
SlidePickerBox* mHundredYearBox;
SlidePickerBox* mTenYearBox;
SlidePickerBox* mYearBox;
SlidePickerBox* mMonthBox;
SlidePickerBox* mDayBox;
void initBox(SlidePickerBox* aBox, const QStringList& aItemsValues, int width = 50);
void addSplitLabel();
}; };