Вопрос по qt, c++ – Отключить элемент в Qt Combobox
4
ответа
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);
Выше код является пересмотренным и более общим решением для моегокомментарий в блоге.
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);
}
Вот:
// 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
- вот что заставляет этот код работать. Это не общее решение, которое будет работать с произвольной моделью.