Add disable and enable item method, resizeLabelWidth method;, valueChanged signal to SlidePickerBox.
This commit is contained in:
@@ -19,7 +19,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) {
|
|||||||
label->setObjectName("sliderPickerLabel");
|
label->setObjectName("sliderPickerLabel");
|
||||||
label->setFixedHeight(fontSize);
|
label->setFixedHeight(fontSize);
|
||||||
label->setFixedWidth(320);
|
label->setFixedWidth(320);
|
||||||
QPoint p = this->mapToGlobal({this->contentsMargins().left(),50-fontSize/2});
|
QPoint p = {0,50-fontSize/2};
|
||||||
label->move(p);
|
label->move(p);
|
||||||
lbls.push_back(label);
|
lbls.push_back(label);
|
||||||
QLabel* label1 = new QLabel(this);
|
QLabel* label1 = new QLabel(this);
|
||||||
@@ -29,7 +29,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) {
|
|||||||
label1->setObjectName("sliderPickerLabel");
|
label1->setObjectName("sliderPickerLabel");
|
||||||
label1->setFixedHeight(fontSize);
|
label1->setFixedHeight(fontSize);
|
||||||
label1->setFixedWidth(320);
|
label1->setFixedWidth(320);
|
||||||
QPoint p1 = this->mapToGlobal({this->contentsMargins().left(),150-fontSize/2});
|
QPoint p1 = {0,150-fontSize/2};
|
||||||
label1->move(p1);
|
label1->move(p1);
|
||||||
lbls.push_back(label1);
|
lbls.push_back(label1);
|
||||||
QLabel* label2 = new QLabel(this);
|
QLabel* label2 = new QLabel(this);
|
||||||
@@ -39,7 +39,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) {
|
|||||||
label2->setObjectName("sliderPickerLabel");
|
label2->setObjectName("sliderPickerLabel");
|
||||||
label2->setFixedHeight(fontSize);
|
label2->setFixedHeight(fontSize);
|
||||||
label2->setFixedWidth(320);
|
label2->setFixedWidth(320);
|
||||||
QPoint p2 = this->mapToGlobal({this->contentsMargins().left(),250-fontSize/2});
|
QPoint p2 = {0,250-fontSize/2};
|
||||||
label2->move(p2);
|
label2->move(p2);
|
||||||
lbls.push_back(label2);
|
lbls.push_back(label2);
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ SlidePickerBox::SlidePickerBox(QWidget *parent):QWidget(parent) {
|
|||||||
line1->setFixedSize(320,100);
|
line1->setFixedSize(320,100);
|
||||||
line1->setObjectName("topBottomLine");
|
line1->setObjectName("topBottomLine");
|
||||||
line1->raise();
|
line1->raise();
|
||||||
QPoint lp = this->mapToGlobal({this->contentsMargins().left(),100});
|
QPoint lp = {0,100};
|
||||||
line1->move(lp);
|
line1->move(lp);
|
||||||
|
|
||||||
selectedIndex = 1;
|
selectedIndex = 1;
|
||||||
@@ -76,11 +76,13 @@ void SlidePickerBox::mouseMoveEvent(QMouseEvent *ev) {
|
|||||||
}
|
}
|
||||||
//防止拉过头
|
//防止拉过头
|
||||||
int selectItemCenter = selectedLbl->geometry().center().y();
|
int selectItemCenter = selectedLbl->geometry().center().y();
|
||||||
if (selectedLbl == lbls.last() && selectItemCenter<=150 && offset<0) return;
|
if (selectedLbl == getEnabledLastLabel() && selectItemCenter<=150 && offset<0) return;
|
||||||
if (selectedLbl == lbls.first() && selectItemCenter>=150 && offset>0) return;
|
if (selectedLbl == getEnabledFirstLabel() && selectItemCenter>=150 && offset>0) return;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (auto item : lbls)
|
for (auto item : lbls)
|
||||||
{
|
{
|
||||||
|
if (disableItems.contains(item->text()))continue;
|
||||||
|
|
||||||
//不需要横向
|
//不需要横向
|
||||||
//int nx = item->geometry().left()+(ev->pos().x()-o_x);
|
//int nx = item->geometry().left()+(ev->pos().x()-o_x);
|
||||||
int ny = item->geometry().top() + offset;
|
int ny = item->geometry().top() + offset;
|
||||||
@@ -109,6 +111,8 @@ void SlidePickerBox::mouseReleaseEvent(QMouseEvent *ev) {
|
|||||||
isDragging = false;
|
isDragging = false;
|
||||||
adjustPositon();
|
adjustPositon();
|
||||||
QWidget::mouseReleaseEvent(ev);
|
QWidget::mouseReleaseEvent(ev);
|
||||||
|
QString v = getSelectedValue();
|
||||||
|
emit valueChanged(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlidePickerBox::adjustPositon() const {
|
void SlidePickerBox::adjustPositon() const {
|
||||||
@@ -163,7 +167,7 @@ void SlidePickerBox::setItems(QStringList itemsList) {
|
|||||||
lbl->setFixedHeight(fontSize);
|
lbl->setFixedHeight(fontSize);
|
||||||
lbl->setFixedWidth(320);
|
lbl->setFixedWidth(320);
|
||||||
lbls.push_back(lbl);
|
lbls.push_back(lbl);
|
||||||
QPoint p = this->mapToGlobal({this->contentsMargins().left(),-150});
|
QPoint p = {0,-150};
|
||||||
lbl->move(p);
|
lbl->move(p);
|
||||||
}
|
}
|
||||||
selectedIndex = lbls.count()-1;
|
selectedIndex = lbls.count()-1;
|
||||||
@@ -178,36 +182,32 @@ QString SlidePickerBox::getSelectedValue() {
|
|||||||
void SlidePickerBox::setCurrentLabel(QLabel *label) {
|
void SlidePickerBox::setCurrentLabel(QLabel *label) {
|
||||||
if (selectedLbl)hideLabel(selectedLbl);
|
if (selectedLbl)hideLabel(selectedLbl);
|
||||||
if (label) {
|
if (label) {
|
||||||
QPoint lp = this->mapToGlobal({this->contentsMargins().left(), 100});
|
QPoint lp = {0, 100};
|
||||||
label->move(lp);
|
label->move(lp);
|
||||||
label->show();
|
label->show();
|
||||||
selectedLbl = label;
|
selectedLbl = label;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlidePickerBox::setNextLabel(QLabel *label) {
|
QLabel * SlidePickerBox::getEnabledFirstLabel() {
|
||||||
if (nextLbl)hideLabel(nextLbl);
|
if (disableItems.empty()) return lbls.first();
|
||||||
if (label){
|
for(int idx = 0; idx<disableItems.size(); idx++){
|
||||||
QPoint lp = this->mapToGlobal({this->contentsMargins().left(),200});
|
if(disableItems.contains(lbls[idx]->text()))continue;
|
||||||
label->move(lp);
|
return lbls[idx];
|
||||||
label->show();
|
|
||||||
nextLbl = label;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlidePickerBox::setPrevLabel(QLabel *label) {
|
QLabel * SlidePickerBox::getEnabledLastLabel() {
|
||||||
if (prevLbl)hideLabel(prevLbl);
|
if (disableItems.empty()) return lbls.last();
|
||||||
if (label) {
|
for(int idx = lbls.size()-1; idx>=0; idx--){
|
||||||
QPoint lp = this->mapToGlobal({this->contentsMargins().left(), 0});
|
if(disableItems.contains(lbls[idx]->text()))continue;
|
||||||
label->move(lp);
|
return lbls[idx];
|
||||||
label->show();
|
|
||||||
prevLbl = label;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlidePickerBox::hideLabel(QLabel *label) {
|
void SlidePickerBox::hideLabel(QLabel *label) {
|
||||||
if (!label) return;
|
if (!label) return;
|
||||||
QPoint lp = this->mapToGlobal({this->contentsMargins().left(), -150});
|
QPoint lp = {0, -150};
|
||||||
label->move(lp);
|
label->move(lp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,11 +221,53 @@ void SlidePickerBox::setSelectedValue(const QString& val) {
|
|||||||
}
|
}
|
||||||
int first_y = -100 * (selectedIndex-1);
|
int first_y = -100 * (selectedIndex-1);
|
||||||
for (int i = 0; i < lbls.count() ; ++i) {
|
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]->move(lp);
|
||||||
lbls[i]->show();
|
lbls[i]->show();
|
||||||
lbls[i]->setStyleSheet("background:transparent");
|
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];
|
selectedLbl = lbls[selectedIndex];
|
||||||
lbls[selectedIndex]->setStyleSheet("color:white");
|
lbls[selectedIndex]->setStyleSheet("color:white");
|
||||||
|
|||||||
@@ -13,11 +13,21 @@ public:
|
|||||||
explicit SlidePickerBox(QWidget *parent = nullptr);
|
explicit SlidePickerBox(QWidget *parent = nullptr);
|
||||||
QString getSelectedValue();
|
QString getSelectedValue();
|
||||||
void setItems(QStringList itemsList);
|
void setItems(QStringList itemsList);
|
||||||
void addItem(QString& item)
|
void addItem(QString& item) {
|
||||||
{
|
|
||||||
this->items.append(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 setSelectedValue(const QString& val);
|
||||||
|
void resizeLabelWidth();
|
||||||
|
void setDefaultAlignment(QFlags<Qt::AlignmentFlag> align){
|
||||||
|
this->defaultAlign = align;
|
||||||
|
}
|
||||||
|
signals:
|
||||||
|
void valueChanged(QString & value);
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
bool isDragging;
|
bool isDragging;
|
||||||
@@ -33,9 +43,10 @@ protected:
|
|||||||
}
|
}
|
||||||
void setCurrentLabel(QLabel* label);
|
void setCurrentLabel(QLabel* label);
|
||||||
|
|
||||||
void setPrevLabel(QLabel* label);
|
QLabel * getEnabledLastLabel();
|
||||||
void setNextLabel(QLabel* label);
|
QLabel * getEnabledFirstLabel();
|
||||||
void hideLabel(QLabel* label);
|
void hideLabel(QLabel* label);
|
||||||
|
void rearrangeLabels();
|
||||||
private:
|
private:
|
||||||
int o_x=0,o_y=10;
|
int o_x=0,o_y=10;
|
||||||
int selectedIndex = -1;
|
int selectedIndex = -1;
|
||||||
@@ -44,7 +55,8 @@ private:
|
|||||||
QLabel* nextLbl = nullptr;
|
QLabel* nextLbl = nullptr;
|
||||||
QList<QLabel*> lbls;
|
QList<QLabel*> lbls;
|
||||||
QStringList items;
|
QStringList items;
|
||||||
|
QStringList disableItems;
|
||||||
|
QFlags<Qt::AlignmentFlag> defaultAlign= Qt::AlignCenter;
|
||||||
void adjustPositon() const;
|
void adjustPositon() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user