Отключить элемент в Qt Combobox - программирование
Подтвердить что ты не робот

Отключить элемент в Qt Combobox

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

4b9b3361

Ответ 1

Взято из здесь:

// 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 - то, что заставляет этот код работать. Это не общее решение, которое будет работать с произвольной моделью.

Ответ 2

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

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);

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

Ответ 3

Зачем взломать.. Мы знаем, что модель QStandardItemModel...

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

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

Ответ 4

Вы можете использовать модель 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);
}