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 р. 01:37

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

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

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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