连接三个组合框来控制qt中可用的选项

时间:2013-02-04 02:03:16

标签: qt combobox

我有三个组合框,有三个相似的选项,'one','two','three',我想在不同的组合框中阻止相同的选项。

示例:

combobox1:'one',

因此,当我选择使用combobox2和combobox3时,只有“两个”和“三个”可供选择。

我知道我可以在for循环和if的组合中做到这一点,但任何人都可以帮我一些我可以在这里使用的技巧吗?

3 个答案:

答案 0 :(得分:1)

如何只使用一个组合框?只有六种可能的选择:

  1. 一二三
  2. 一三二
  3. 二一三
  4. 二三一
  5. 三一二
  6. 三二一
  7. 用户只使用一个组合框而不是使用三个可用选项不断变化的组合框会更容易。

答案 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;
}

请注意,当一个项目被添加回到一个框的列表中时,它只会被添加到列表的末尾,因此随着时间的推移,您的项目的顺序可能会被加扰。

希望有所帮助。