gpt4 book ai didi

c++ - 从列表中选择项目到其他列表的 Qt 实现(双列表、累加器、列表构建器、TwoListSelection ...)

转载 作者:行者123 更新时间:2023-11-30 00:44:34 27 4
gpt4 key购买 nike

我想从任意长度的列表中选择任意数量的项目。下拉列表 (QComboBox) 不允许选中项目。如果有很多项目,可检查项目的列表会变得笨拙。

我找到了 this question在用户体验 SE 子站点和 this answer似乎是最适合我需要的解决方案。它有很多名字,如上述回答评论中的评论:Dual List、Accumulator、List builder、TwoListSelection ...

来自 OpenFaces.org 的版本在上面链接的答案中显示:

a

不过,我找不到 Qt 中的实现。我应该自己实现还是在 Qt 中有可用的实现?有推荐的方法吗?

最佳答案

这个小部件在 Qt 中不是默认的,但是构建它并不复杂,你应该做的第一件事就是列出要求:

  • 如果左侧列表不为空,则启用带有文本 >>> 的按钮,如果按下它必须移动所有项目。

  • 带有文本 << 的按钮与上一个类似,但右侧有列表

  • 如果左侧列表中的项目被选中,带有文本 > 的按钮将被启用,如果按下,则所选项目应移动到右侧。

  • 带有文本 < 的按钮与右侧相同。

  • 如果选择了一个项目并且这不是列表中的第一个项目,则会启用带有“向上”文本的按钮。按下时,您必须将当前项目移动到更高的位置。

  • 如果选择了一个项目并且这不是列表中的最后一个项目,则启用带有“向下”文本的按钮。按下时,您必须将当前项目移动到较低位置。

正如我们所看到的,大部分逻辑都取决于项目的选择,为此我们将信号 itemSelectionChanged 与决定按钮是否启用的插槽连接起来。

要移动项目,我们必须使用 takeItem()addItem(),第一个删除项目,第二个添加项目。

向上或向下移动相当于删除项目然后插入它,为此我们再次使用 takeItem()insertItem()

以上所有内容都在以下小部件中实现:

#ifndef TWOLISTSELECTION_H
#define TWOLISTSELECTION_H

#include <QHBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QWidget>

class TwoListSelection : public QWidget
{
Q_OBJECT
public:
explicit TwoListSelection(QWidget *parent = nullptr):QWidget{parent}{
init();
connections();
}

void addAvailableItems(const QStringList &items){
mInput->addItems(items);
}

QStringList seletedItems(){
QStringList selected;
for(int i=0; i<mOuput->count(); i++)
selected<< mOuput->item(i)->text();
return selected;
}
private:
void init(){
QHBoxLayout *layout = new QHBoxLayout(this);
mInput = new QListWidget;
mOuput = new QListWidget;

mButtonToSelected = new QPushButton(">>");
mBtnMoveToAvailable= new QPushButton(">");
mBtnMoveToSelected= new QPushButton("<");
mButtonToAvailable = new QPushButton("<<");

layout->addWidget(mInput);

QVBoxLayout *layoutm = new QVBoxLayout;
layoutm->addItem(new QSpacerItem(10, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));
layoutm->addWidget(mButtonToSelected);
layoutm->addWidget(mBtnMoveToAvailable);
layoutm->addWidget(mBtnMoveToSelected);
layoutm->addWidget(mButtonToAvailable);
layoutm->addItem(new QSpacerItem(10, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));

layout->addLayout(layoutm);
layout->addWidget(mOuput);

mBtnUp = new QPushButton("Up");
mBtnDown = new QPushButton("Down");

QVBoxLayout *layoutl = new QVBoxLayout;
layoutl->addItem(new QSpacerItem(10, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));
layoutl->addWidget(mBtnUp);
layoutl->addWidget(mBtnDown);
layoutl->addItem(new QSpacerItem(10, 20, QSizePolicy::Minimum, QSizePolicy::Expanding));

layout->addLayout(layoutl);
setStatusButton();
}

void connections(){
connect(mOuput, &QListWidget::itemSelectionChanged, this, &TwoListSelection::setStatusButton);
connect(mInput, &QListWidget::itemSelectionChanged, this, &TwoListSelection::setStatusButton);
connect(mBtnMoveToAvailable, &QPushButton::clicked, [=](){
mOuput->addItem(mInput->takeItem(mInput->currentRow()));
});

connect(mBtnMoveToSelected, &QPushButton::clicked, [=](){
mInput->addItem(mOuput->takeItem(mOuput->currentRow()));
});

connect(mButtonToAvailable, &QPushButton::clicked, [=](){
while (mOuput->count()>0) {
mInput->addItem(mOuput->takeItem(0));
}
});

connect(mButtonToSelected, &QPushButton::clicked, [=](){
while (mInput->count()>0) {
mOuput->addItem(mInput->takeItem(0));
}
});

connect(mBtnUp, &QPushButton::clicked, [=](){
int row = mOuput->currentRow();
QListWidgetItem *currentItem = mOuput->takeItem(row);
mOuput->insertItem(row-1, currentItem);
mOuput->setCurrentRow(row-1);
});

connect(mBtnDown, &QPushButton::clicked, [=](){
int row = mOuput->currentRow();
QListWidgetItem *currentItem = mOuput->takeItem(row);
mOuput->insertItem(row+1, currentItem);
mOuput->setCurrentRow(row+1);
});
}

void setStatusButton(){
mBtnUp->setDisabled(mOuput->selectedItems().isEmpty() || mOuput->currentRow() == 0);
mBtnDown->setDisabled(mOuput->selectedItems().isEmpty() || mOuput->currentRow() == mOuput->count()-1);
mBtnMoveToAvailable->setDisabled(mInput->selectedItems().isEmpty());
mBtnMoveToSelected->setDisabled(mOuput->selectedItems().isEmpty());
}

QListWidget *mInput;
QListWidget *mOuput;

QPushButton *mButtonToAvailable;
QPushButton *mButtonToSelected;

QPushButton *mBtnMoveToAvailable;
QPushButton *mBtnMoveToSelected;

QPushButton *mBtnUp;
QPushButton *mBtnDown;
};

#endif // TWOLISTSELECTION_H

enter image description here

在下面link你会找到一个完整的例子。

关于c++ - 从列表中选择项目到其他列表的 Qt 实现(双列表、累加器、列表构建器、TwoListSelection ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48327558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com