Evgenii Legotckoi
Evgenii Legotckoi03 травня 2017 р. 12:23

Qt/C++ - Урок 064. Як приховати елементи зі спадного списку QComboBox

У деяких випадках потрібно приховати деякі елементи зі списку 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);
}

Архів з проектом

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Q
  • 24 грудня 2017 р. 18:16
  1. void Widget::hideRow()
  2. {
  3. qobject_cast<QListView *>(comboBox->view())->setRowHidden(lineEdit->text().toInt(), true);
  4. }
ВА
  • 07 серпня 2018 р. 10:02

А как скрыть саму запись, без удаления строки из drop-down меню?

Evgenii Legotckoi
  • 08 серпня 2018 р. 03:49

Что простите? Откуда именно Вы собрались скрывать запись? И ищ выпадающего спика она не удаляется, а скрывается.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
i
innorwall15 листопада 2024 р. 08:26
Qt/C++ – Урок 031. QCustomPlot – Побудова діаграм з часом buy generic priligy We can just chat, and we will not lose too much time anyway
i
innorwall15 листопада 2024 р. 06:03
Qt/C++ - Урок 060. Налаштування зовнішнього вигляду програми під час виконання I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 листопада 2024 р. 22:42
Як скопіювати файли в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 листопада 2024 р. 20:09
Qt/C++ - Підручник 068. Hello World за допомогою системи збирання CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
Тепер обговоріть на форумі
i
innorwall14 листопада 2024 р. 14:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 листопада 2024 р. 21:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов03 жовтня 2024 р. 14:05
Реализация навигации по разделам Спасибо Евгений!

Слідкуйте за нами в соціальних мережах