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); }
А как скрыть саму запись, без удаления строки из drop-down меню?
Что простите? Откуда именно Вы собрались скрывать запись? И ищ выпадающего спика она не удаляется, а скрывается.