Вопрос по qt, c++ – Отключить элемент в Qt Combobox

17

Я не могу найти стандартный способ отключить отдельный элемент в поле со списком Qt. Есть ли возможность сделать это в Qt, что мне не хватает?

Ваш Ответ

4   ответа
16

QStandardItemModel (что он делает по умолчанию), то вы можете держаться подальше отQt::UserRole -1 взломать (см.Сообщение блога на что Десмонд ссылается в своемответ выше):

const QStandardItemModel* model = qobject_cast<const QStandardItemModel*>(ui->comboBox->model());
QStandardItem* item = model->item(1);

item->setFlags(disable ? item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled)
                       : Qt::ItemIsSelectable|Qt::ItemIsEnabled));
// visually disable by greying out - works only if combobox has been painted already and palette returns the wanted color
item->setData(disable ? ui->comboBox->palette().color(QPalette::Disabled, QPalette::Text)
                      : QVariant(), // clear item data in order to use default color
              Qt::TextColorRole);

Выше код является пересмотренным и более общим решением для моегокомментарий в блоге.

Вы также можете установить подсказку о размере элемента на 0 высот, чтобы запись исчезла: item-> gt; setSizeHint (отключить? QSize (20,0): QSize ());
2

QListWidget в качестве прокси.

QComboBox *combo = new QComboBox(this);
QListWidget *contents = new QListWidget(combo);
contents->hide();
combo->setModel(contents->model());

/* Populate contents */
contents->addItem("...");    // Etcetera

Затем этот метод отключит элемент:

void disableItem(int index)
{
    QListWidgetItem *item = contents->item(index);
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
}
Нет необходимости удалятьcontents вручную, как естьcombo как его родитель. Так когдаcombo удаляется, он удаляетcontents также.
Я думаю, что этот подход делает вещи читабельными, но я думаю, что мы не должны забывать удалять контент, когда поле со списком удаляется, верно?
7

Вот:

// Get the index of the value to disable
QModelIndex index = ui.comboBox->model()->index(1, 0); 

// This is the effective 'disable' flag
QVariant v(0);

// the magic
ui.comboBox->model()->setData(index, v, Qt::UserRole - 1);

Чтобы снова включить, используйте:

QVariant v(1 | 32);

Используемая модель отображаетflags слово дляQt::UserRole - 1 - вот что заставляет этот код работать. Это не общее решение, которое будет работать с произвольной моделью.

@Sosukodo, просто подумайте о глухих моделях как о примерах, а не о чем-то, что вы действительно должны использовать в каких-то сложных случаях
Это недействительно. Гораздо лучше создать собственную модель списка (или модель прокси), которая будет возвращатьflags должным образом.
@ Lol4t0: гораздо лучше иметь поддержку моделей по умолчанию, включающую & amp; отключение элементов QComboBox.
Все, что нужно, НЕ возвращаетсяQt::ItemIsEnabled от моделиflags() метод.Qt::UserRole - 1 это ужасный хак, на который вы не должны полагаться (это не публичная и не документированная роль). Не говоря уже о1 | 32 который даже не использует символические имена.
@ Lol4t0: Это слабый аргумент.
10

что модель является QStandardItemModel ...

model = dynamic_cast< QStandardItemModel * >( combobox->model() );
item = model->item( row, col );
item->setEnabled( false );

Чистый, элегантный и без взлома ...

Похожие вопросы