C++ 禁用Qt组合框中的项

C++ 禁用Qt组合框中的项,c++,qt,C++,Qt,我找不到一种标准方法来禁用Qt组合框中的单个项。在Qt中是否有我缺少的用于执行此操作的工具?摘自: 要再次启用,请使用: QVariant v(1 | 32); 所使用的模型将标志单词映射到Qt::UserRole-1——这就是代码工作的原因。它不是一个通用的解决方案,不能用于任意模型。您可以使用QListWidget的模型作为代理 QComboBox *combo = new QComboBox(this); QListWidget *contents = new QListWidget(c

我找不到一种标准方法来禁用Qt组合框中的单个项。在Qt中是否有我缺少的用于执行此操作的工具?

摘自:

要再次启用,请使用:

QVariant v(1 | 32);

所使用的模型将
标志
单词映射到
Qt::UserRole-1
——这就是代码工作的原因。它不是一个通用的解决方案,不能用于任意模型。

您可以使用
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);
}

如果您的组合框使用的是
QStandardItemModel
(默认情况下是这样),那么您可以远离
Qt::UserRole-1
黑客攻击(请参见Desmond在其中提到的内容):

const QStandardItemModel*model=qobject\u cast(ui->comboBox->model());
QStandardItem*项目=模型->项目(1);
item->setFlags(禁用?item->flags()&~(Qt::ItemIsSelectable | Qt::ItemIsEnabled)
:Qt::ItemIsSelectable | Qt::ItemIsEnabled));
//通过灰显视觉禁用-仅当组合框已绘制且调色板返回所需颜色时才有效
item->setData(禁用?ui->comboBox->palette().color(Qpalete::Disabled,Qpalete::Text)
:QVariant(),//清除项目数据以使用默认颜色
Qt::TextColorRole);

以上代码是我的博客文章的修订版和更通用的解决方案。

为什么黑客。。我们知道这个模型是一个QS标准模型

model = dynamic_cast< QStandardItemModel * >( combobox->model() );
item = model->item( row, col );
item->setEnabled( false );
model=dynamic_cast(组合框->模型());
项目=模型->项目(行、列);
项目->设置启用(假);

干净、优雅、无瑕疵……

无效。最好是创建自己的列表模型(或代理模型),该模型将正确返回
标志
。只需不从模型的
标志()方法返回
Qt::ItemIsEnabled
Qt::UserRole-1
是一种可怕的黑客攻击,你不应该依赖它(它不是一个公开的、有文档记录的角色)。更不用说甚至不使用符号名的
1 | 32
。@Lol4t0:最好使用默认模型支持启用和禁用QComboBox项。@Sosukodo,只考虑一些例子,而不是SMTH,你应该在某种程度上复杂地使用。cases@Lol4t0:这是一个蹩脚的参数。您还可以将项目大小提示设置为0高度以使条目消失:item->setSizeHint(disable?QSize(20,0):QSize());为什么这么复杂?为什么不像这里?我想这种方法可以让事情变得可读,但我认为我们不应该忘记在删除组合框时删除内容,对吗?没有必要手动删除
内容
,因为它有
组合
作为其父项。因此,当删除
combo
时,它也会删除
内容。
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);
model = dynamic_cast< QStandardItemModel * >( combobox->model() );
item = model->item( row, col );
item->setEnabled( false );