Evgenii Legotckoi
Evgenii Legotckoi3. Mai 2017 12:23

Qt/C++ - Lektion 064. Wie man Elemente aus der QComboBox-Dropdown-Liste ausblendet

In einigen Fällen ist es erforderlich, einige Elemente aus der Combobox QComboBox auszublenden. Beispielsweise erhält der Benutzer die Option, eine von mehreren Optionen in einer QComboBox auszuwählen, aber standardmäßig sollte eine ungültige Option angezeigt werden, die nicht in der Dropdown-Liste enthalten sein sollte. Das heißt, dass standardmäßig etwas Falsches ausgewählt wird, was während der Validierung überprüft wird und dem Benutzer eine Meldung gibt, dass er eine der möglichen verfügbaren Optionen auswählen muss, während die falsche Option nicht in der Liste enthalten ist.

Wenn ich versuche, Informationen zu diesem Thema in Suchmaschinen zu finden, stolpere ich als erstes darüber, wenn ich versuche, einen benutzerdefinierten Delegaten zu verwenden, der von QItemDelegate geerbt wurde, oder wenn ich versuche, mit Flags zu spielen, die auf Elemente in QComboBox gesetzt werden können , aber beide Optionen funktionieren nicht.

Die erste Option mit QItemDelegate funktioniert nicht, denn selbst wenn Sie sicherstellen, dass ein bestimmtes Element nicht gezeichnet wird, wird sein Ort immer noch in der Liste stehen. Es wird an dieser Stelle nur ein leeres Rechteck sein.

Die zweite Option mit Flags ist nicht geeignet, da es kein solches Flag gibt, das QComboBox dazu zwingen würde, ein bestimmtes Element in der Liste auszublenden, obwohl das Flag Qt::ItemIsEnabled dem Wert am nächsten kommt, aber wenn Wenn es zurückgesetzt wird, wird der Text des Elements grau, was anzeigt, dass das Element nicht ausgewählt werden kann.

Sie können auch die Option mit einem Datenmodell und Elementrendering in Betracht ziehen, aber wir kehren wieder zu QItemDelegate zurück, was wiederum nicht funktioniert.


Was ist dann zu tun?

Betrachten wir QComboBox aus einer anderen Perspektive.

Was ist das in der einfachsten Version? – Dies ist eine Schaltfläche, die, wenn sie angeklickt wird, eine Dropdown-Liste anzeigt.

Was ist eine Dropdown-Liste? - Dies ist ein QFrame , der ein Objekt enthält, das von QAbstractItemView. geerbt wurde. Um genau zu sein, QListView.

In diesem Fall enthält QListView ein Datenmodell, aus dem das aktuell ausgewählte Element in QComboBox ersetzt wird, und dasselbe Datenmodell wird verwendet, um eine Liste aller Elemente anzuzeigen. Und QListView selbst kann !WARNUNG! Zeilen verstecken und gleichzeitig nicht aus dem Datenmodell löschen!!! Und in diesem Fall kann in QComboBox das Element, das aus der Dropdown-Liste ausgeblendet werden kann, als aktuelles Element angezeigt werden. SIEG!!!

Implementierung

Lassen Sie uns beispielsweise die folgende Anwendung implementieren. Es gibt eine Combobox mit fünf Elementen. Es gibt einen LineEdit, in den Sie die Nummer des Elements schreiben können, das ausgeblendet werden kann. Und es gibt eine Schaltfläche, durch deren Drücken wir das Element in der Dropdown-Liste ausblenden. Zur Überprüfung können Sie ein beliebiges Element auswählen und aus der Liste ausblenden. Dann stellen Sie sicher, dass es auf QComboBox angezeigt wird, aber es wird nicht in der Combobox sichtbar sein. (Artikelnummern beginnen bei 0)

Die Anwendung wird wie folgt aussehen.

Widget.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);
}

Archiv mit dem Projekt

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Q
  • 24. Dezember 2017 18:16
  1. void Widget::hideRow()
  2. {
  3. qobject_cast<QListView *>(comboBox->view())->setRowHidden(lineEdit->text().toInt(), true);
  4. }

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

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken