From 01bcd510e693a662f52b145e059162205fc32930 Mon Sep 17 00:00:00 2001 From: Krad Date: Fri, 1 Apr 2022 15:30:39 +0800 Subject: [PATCH] Add disable and enable item method, resizeLabelWidth method;, valueChanged signal to SlidePickerBox. --- src/components/SlidePickerBox.cpp | 92 ++++++++++++++++++++++--------- src/components/SlidePickerBox.h | 22 ++++++-- 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/src/components/SlidePickerBox.cpp b/src/components/SlidePickerBox.cpp index dfbf22d..9691229 100644 --- a/src/components/SlidePickerBox.cpp +++ b/src/components/SlidePickerBox.cpp @@ -19,7 +19,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) { label->setObjectName("sliderPickerLabel"); label->setFixedHeight(fontSize); label->setFixedWidth(320); - QPoint p = this->mapToGlobal({this->contentsMargins().left(),50-fontSize/2}); + QPoint p = {0,50-fontSize/2}; label->move(p); lbls.push_back(label); QLabel* label1 = new QLabel(this); @@ -29,7 +29,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) { label1->setObjectName("sliderPickerLabel"); label1->setFixedHeight(fontSize); label1->setFixedWidth(320); - QPoint p1 = this->mapToGlobal({this->contentsMargins().left(),150-fontSize/2}); + QPoint p1 = {0,150-fontSize/2}; label1->move(p1); lbls.push_back(label1); QLabel* label2 = new QLabel(this); @@ -39,7 +39,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) { label2->setObjectName("sliderPickerLabel"); label2->setFixedHeight(fontSize); label2->setFixedWidth(320); - QPoint p2 = this->mapToGlobal({this->contentsMargins().left(),250-fontSize/2}); + QPoint p2 = {0,250-fontSize/2}; label2->move(p2); lbls.push_back(label2); @@ -51,7 +51,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) { line1->setFixedSize(320,100); line1->setObjectName("topBottomLine"); line1->raise(); - QPoint lp = this->mapToGlobal({this->contentsMargins().left(),100}); + QPoint lp = {0,100}; line1->move(lp); selectedIndex = 1; @@ -76,11 +76,13 @@ void SlidePickerBox::mouseMoveEvent(QMouseEvent *ev) { } //防止拉过头 int selectItemCenter = selectedLbl->geometry().center().y(); - if (selectedLbl == lbls.last() && selectItemCenter<=150 && offset<0) return; - if (selectedLbl == lbls.first() && selectItemCenter>=150 && offset>0) return; + if (selectedLbl == getEnabledLastLabel() && selectItemCenter<=150 && offset<0) return; + if (selectedLbl == getEnabledFirstLabel() && selectItemCenter>=150 && offset>0) return; int i = 0; for (auto item : lbls) { + if (disableItems.contains(item->text()))continue; + //不需要横向 //int nx = item->geometry().left()+(ev->pos().x()-o_x); int ny = item->geometry().top() + offset; @@ -109,6 +111,8 @@ void SlidePickerBox::mouseReleaseEvent(QMouseEvent *ev) { isDragging = false; adjustPositon(); QWidget::mouseReleaseEvent(ev); + QString v = getSelectedValue(); + emit valueChanged(v); } void SlidePickerBox::adjustPositon() const { @@ -163,7 +167,7 @@ void SlidePickerBox::setItems(QStringList itemsList) { lbl->setFixedHeight(fontSize); lbl->setFixedWidth(320); lbls.push_back(lbl); - QPoint p = this->mapToGlobal({this->contentsMargins().left(),-150}); + QPoint p = {0,-150}; lbl->move(p); } selectedIndex = lbls.count()-1; @@ -178,36 +182,32 @@ QString SlidePickerBox::getSelectedValue() { void SlidePickerBox::setCurrentLabel(QLabel *label) { if (selectedLbl)hideLabel(selectedLbl); if (label) { - QPoint lp = this->mapToGlobal({this->contentsMargins().left(), 100}); + QPoint lp = {0, 100}; label->move(lp); label->show(); selectedLbl = label; } } -void SlidePickerBox::setNextLabel(QLabel *label) { - if (nextLbl)hideLabel(nextLbl); - if (label){ - QPoint lp = this->mapToGlobal({this->contentsMargins().left(),200}); - label->move(lp); - label->show(); - nextLbl = label; +QLabel * SlidePickerBox::getEnabledFirstLabel() { + if (disableItems.empty()) return lbls.first(); + for(int idx = 0; idxtext()))continue; + return lbls[idx]; } } -void SlidePickerBox::setPrevLabel(QLabel *label) { - if (prevLbl)hideLabel(prevLbl); - if (label) { - QPoint lp = this->mapToGlobal({this->contentsMargins().left(), 0}); - label->move(lp); - label->show(); - prevLbl = label; +QLabel * SlidePickerBox::getEnabledLastLabel() { + if (disableItems.empty()) return lbls.last(); + for(int idx = lbls.size()-1; idx>=0; idx--){ + if(disableItems.contains(lbls[idx]->text()))continue; + return lbls[idx]; } } void SlidePickerBox::hideLabel(QLabel *label) { if (!label) return; - QPoint lp = this->mapToGlobal({this->contentsMargins().left(), -150}); + QPoint lp = {0, -150}; label->move(lp); } @@ -221,11 +221,53 @@ void SlidePickerBox::setSelectedValue(const QString& val) { } int first_y = -100 * (selectedIndex-1); for (int i = 0; i < lbls.count() ; ++i) { - QPoint lp = {this->contentsMargins().left(), first_y+i*100}; + + QPoint lp = this->mapTo(this,{0, first_y+i*100}); lbls[i]->move(lp); lbls[i]->show(); lbls[i]->setStyleSheet("background:transparent"); - lbls[i]->lower(); + + } + selectedLbl = lbls[selectedIndex]; + lbls[selectedIndex]->setStyleSheet("color:white"); + adjustPositon(); +} + +void SlidePickerBox::resizeLabelWidth() { + for (int i = 0; i < lbls.count() ; ++i) { + lbls[i]->setAlignment(defaultAlign); + lbls[i]->setFixedWidth(this->width()+this->contentsMargins().left()+this->contentsMargins().right()); + } +} + +void SlidePickerBox::disableItem(const QString& val) { + if (!disableItems.contains(val)){ + disableItems.append(val); + rearrangeLabels(); + } +} + +void SlidePickerBox::enableItem(const QString &val) { + if (disableItems.contains(val)){ + disableItems.removeOne(val); + rearrangeLabels(); + } +} + +void SlidePickerBox::rearrangeLabels() { + int first_y = -100 * (selectedIndex-1); + int r_index = 0; + for (int i = 0; i < lbls.count() ; ++i) { + if (disableItems.contains(lbls[i]->text())){ + lbls[i]->hide(); + continue; + } + QPoint lp = this->mapTo(this,{0, first_y+r_index*100}); + r_index++; + lbls[i]->move(lp); + lbls[i]->show(); + lbls[i]->setStyleSheet("background:transparent"); + } selectedLbl = lbls[selectedIndex]; lbls[selectedIndex]->setStyleSheet("color:white"); diff --git a/src/components/SlidePickerBox.h b/src/components/SlidePickerBox.h index fe6e45c..7df8865 100644 --- a/src/components/SlidePickerBox.h +++ b/src/components/SlidePickerBox.h @@ -13,11 +13,21 @@ public: explicit SlidePickerBox(QWidget *parent = nullptr); QString getSelectedValue(); void setItems(QStringList itemsList); - void addItem(QString& item) - { + void addItem(QString& item) { this->items.append(item); } + void disableItem(const QString& val); + void enableItem(const QString& val); + int getItemsCount(){ + return items.size(); + } void setSelectedValue(const QString& val); + void resizeLabelWidth(); + void setDefaultAlignment(QFlags align){ + this->defaultAlign = align; + } + signals: + void valueChanged(QString & value); protected: bool isDragging; @@ -33,9 +43,10 @@ protected: } void setCurrentLabel(QLabel* label); - void setPrevLabel(QLabel* label); - void setNextLabel(QLabel* label); + QLabel * getEnabledLastLabel(); + QLabel * getEnabledFirstLabel(); void hideLabel(QLabel* label); + void rearrangeLabels(); private: int o_x=0,o_y=10; int selectedIndex = -1; @@ -44,7 +55,8 @@ private: QLabel* nextLbl = nullptr; QList lbls; QStringList items; - + QStringList disableItems; + QFlags defaultAlign= Qt::AlignCenter; void adjustPositon() const; };