- 1. Що ж тоді робити?
- 2. Реалізація
- 1. віджет.h
- 2. widget.cpp
У деяких випадках потрібно приховати деякі елементи зі списку QComboBox . Наприклад, користувачеві дається можливість вибрати один з декількох варіантів у QComboBox , але за замовчуванням повинен відображатися невалідний варіант, який повинен бути відсутнім у списку, що випадає. Тобто за замовчуванням вибрано щось неправильне, що при валідації буде перевірено і видасть користувачеві повідомлення, що потрібно вибрати один із можливих варіантів, які доступні, тоді як неправильний варіант відсутній у списку.
При спробі знайти інформацію в пошукових системах з цієї теми насамперед натикаєшся на варіанти, коли намагаються використовувати кастомний делегат, успадкований від QItemDelegate , або спроби грати з прапорами, які можна встановити елементам у QComboBox , але обидва варіанти не працюють.
Перший варіант з QItemDelegate не буде працювати тому, що якщо навіть зробити так, що певний елемент не малюватиметься, його місце знаходження буде в списку. Просто тут буде порожній прямокутник.
Другий варіант із прапорами не підходить тому, що немає такого прапора, який змусив би QComboBox приховати певний елемент у списку, хоча найбільш близьким за значенням є прапор Qt::ItemIsEnabled , але якщо його скинути, то тоді текст елемента стає сірим, показуючи, що вибрати елемент не можна.
Ще можна розглянути варіант з моделлю даних та відмальовуванням елементів, але ми знову ж таки повертаємося до QItemDelegate , який знову ж таки не працює.
Що ж тоді робити?
Поглянемо на QComboBox з іншого погляду.
Що це таке в найпростішому варіанті? - Це кнопка, на кліку на яку з'являється список, що випадає.
** Що таке список, що випадає?
В даному випадку QListView буде містити модель даних, з якої підставляється поточний вибраний елемент QComboBox і ця ж модель даних служить для відображення списку всіх елементів. А сам QListView може !УВАГА! приховувати рядки і при цьому не видаляти їх із моделі даних! І в даному випадку в QComboBox може відображатися як поточний елемент той елемент, який можна приховати з списку. WIN!!!
Реалізація
Наприклад реалізуємо наступне додаток. Є комбобокс із п'ятьма елементами. Є LineEdit, у якому можна написати номер елемента, який можна приховати. І є кнопка, за натисканням якої, ми приховуємо елемент у списку, що випадає. Для перевірки можна вибрати якийсь елемент і приховати саме його зі списку. Тоді Ви переконаєтеся, що він буде відображатися на QComboBox , але у списку, що випадає, він не буде видно. (Номери елементів починаються з 0)
Програма буде виглядати так.
віджет.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QComboBox> #include <QPushButton> #include <QLineEdit> #include <QListView> class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void hideRow(); private: QComboBox *comboBox; QPushButton *hideButton; // кнопка по клику которой будем скрывать заданный элемент QLineEdit *lineEdit; // lineEdit, в который будем задавать элемент для скрытия QListView *listView; // указатель на список элементов }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include <QGridLayout> Widget::Widget(QWidget *parent) : QWidget(parent), comboBox(new QComboBox(this)), hideButton(new QPushButton("Hide", this)), lineEdit(new QLineEdit(this)) { QGridLayout *gridLayout = new QGridLayout(this); setLayout(gridLayout); gridLayout->addWidget(comboBox, 0, 0, 1, 2); gridLayout->addWidget(hideButton, 1, 0, 1, 1); gridLayout->addWidget(lineEdit, 1, 1, 1, 1); listView = new QListView(comboBox); comboBox->setView(listView); comboBox->addItem("0"); comboBox->addItem("1"); comboBox->addItem("2"); comboBox->addItem("3"); comboBox->addItem("4"); connect(hideButton, &QPushButton::clicked, this, &Widget::hideRow); } Widget::~Widget() { } void Widget::hideRow() { listView->setRowHidden(lineEdit->text().toInt(), true); }
А как скрыть саму запись, без удаления строки из drop-down меню?
Что простите? Откуда именно Вы собрались скрывать запись? И ищ выпадающего спика она не удаляется, а скрывается.