Выберите элемент из одного ComboBox и удалите этот элемент из других ComboBox.

Я пишу приложение QT, где у меня есть 3 QComboBoxes со списком значений. Я пытаюсь сделать это, когда я выбираю один элемент в QComboBox, я удаляю его из других QComboBox, а когда я выбираю другой или ничего, он снова появляется в других QComboBox.

У вас есть идеи на этот счет?

Редактировать: я пытался использовать QStringList, где у меня был слот, который удалял его из других QComboBox, но он был очень глючным и часто вставлял 2 пробела и один и тот же напиток дважды.


person Thisen    schedule 11.12.2014    source источник
comment
Все ли поля со списком содержат одинаковые элементы?   -  person thuga    schedule 11.12.2014
comment
Когда ничего не выбрано, да. Но, например, когда один элемент выбран в ComboBox1, он будет удален из ComboBox2 и ComboBox3.   -  person Thisen    schedule 11.12.2014


Ответы (1)


Если все поля со списком содержат одни и те же элементы, вы можете использовать текущий индекс одного поля со списком, чтобы отключить и скрыть этот индекс других полей со списком.

Вы можете просто создать подкласс QComboBox и создать такой слот:

void MyComboBox::disableItem(int index)
{
    QListView *list_view = qobject_cast<QListView*>(view());
    if(list_view)
    {
        QStandardItemModel *model =  qobject_cast<QStandardItemModel*>(list_view->model());   
        list_view->setRowHidden(index, true);
        if(model)
        {
            model->item(index, 0)->setEnabled(false);
        }   
    }
}

Затем вы просто подключаете к этому слоту сигнал QComboBox::currentIndexChanged(int index) из других полей со списком. . Сделайте это для всех трех выпадающих списков.

Вы также должны создать логику для включения и повторного отображения элементов, когда их не следует отключать. Это почти та же функция, что и выше. Вы можете просто создать список индексов, которые должны быть скрыты для этого поля со списком, и использовать его для отображения всех остальных индексов.

person thuga    schedule 11.12.2014
comment
Итак, я попробовал ваше решение, и когда я меняю индекс одного из ComboBox, он падает. Я использовал несколько сообщений qDebug и обнаружил, что сбои происходят, когда я пытаюсь использовать ListView. Сначала я не смог скомпилировать и получил, что термин ошибки не оценивает функцию, принимающую 0 аргументов, а затем подумал, что представление () after было ошибкой, поэтому я попытался удалить их, но затем он вылетает. Я попытался изменить представление на QObject::sender(), но это приводит к сбою при преобразовании QStandardItemModel. - person Thisen; 11.12.2014
comment
@Thisen QComboBox::view — общедоступная функция класса QComboBox. Попробуйте переименовать локальную переменную QListView view во что-нибудь другое, например QListView list_view. - person thuga; 11.12.2014