我有三个组合框,有三个相似的选项,'one','two','three',我想在不同的组合框中阻止相同的选项。
示例:
combobox1:'one',
因此,当我选择使用combobox2和combobox3时,只有“两个”和“三个”可供选择。
我知道我可以在for循环和if的组合中做到这一点,但任何人都可以帮我一些我可以在这里使用的技巧吗?
答案 0 :(得分:1)
如何只使用一个组合框?只有六种可能的选择:
用户只使用一个组合框而不是使用三个可用选项不断变化的组合框会更容易。
答案 1 :(得分:1)
编写自己的类MyComboBox
,该类派生自QComboBox
。
在MyComboBox
中实施一个可以执行以下操作的插槽:
void excludeIndex(const QString & text)
{
// Get the list of all the options for the ComboBox
QStringList list = getIndices();
// Remove one (the only) item 'text' from the list
list.removeOne( text );
// Clear the ComboBox and fill with the new values
this->clear();
this->addItems( list );
}
在您的父窗口小部件/应用程序中,将每个“发送”void currentIndexChanged(const QString & text)
或MyComboBox
的信号QComboBox
连接到“接收”MyComboBox
的此广告位。
如果您需要从多个其他ComboBox
es中排除这些值,那么最好在父Widget
中实现该插槽。这样,您就可以遍历所有“接收”ComboBox
es。根据{{1}},您将读取其他ComboBox
es的所有当前值,并从ComboBox
中删除这些值。您在父list
中的广告位不再需要输入Widget
。
答案 2 :(得分:0)
这是一个解决方案。
基本上它会使用所有项目初始化所有框,并且当框的当前文本被更改时,它会从其他框中删除该文本。如果框中包含的前一个文本不是空白,则将其添加回所有其他框中。
如果您想用超过8的测试,请将mainwindow.cpp中的变量m_numOfBoxes
更改为其他值。
的main.cpp
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QComboBox>
#include <QList>
#include <QStringList>
#include <QMap>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void on_comboBox_changed();
private:
QList <QComboBox *> m_boxes;
QMap <QComboBox *, QString> m_previousText;
int m_numOfBoxes;
QStringList m_allItems;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QVBoxLayout * vbox = new QVBoxLayout();
m_numOfBoxes = 8;
m_allItems << "";
for(int i = 0; i< m_numOfBoxes; i++)
{
m_allItems << QString::number(i+1);
}
for(int i = 0; i< m_numOfBoxes; i++)
{
QComboBox * temp = new QComboBox;
QObject::connect(temp, SIGNAL(currentIndexChanged(int)), this, SLOT(on_comboBox_changed()));
vbox->addWidget(temp);
temp->addItems(m_allItems);
m_boxes.append(temp);
m_previousText[temp] = "";
}
this->setCentralWidget(new QWidget());
this->centralWidget()->setLayout(vbox);
}
MainWindow::~MainWindow()
{
}
void MainWindow::on_comboBox_changed()
{
QComboBox * editedBox = qobject_cast <QComboBox *> (QObject::sender());
QString currentText = editedBox->currentText();
if(currentText == m_previousText[editedBox])
{
return;
}
foreach(QComboBox * box, m_boxes)
{
if(box == editedBox)
{
continue;
}
if(currentText != "")
{
// remove the current text from the other boxes
int index = box->findText(currentText);
if(index != -1)
{
box->removeItem(index);
}
}
if(m_previousText[editedBox] != "")
{
// add the previous text back into the lists for the other boxes
box->addItem(m_previousText[editedBox]);
qDebug() << "Adding back" << m_previousText[editedBox];
}
}
m_previousText[editedBox] = currentText;
}
请注意,当一个项目被添加回到一个框的列表中时,它只会被添加到列表的末尾,因此随着时间的推移,您的项目的顺序可能会被加扰。
希望有所帮助。