C++ 禁用Qt组合框中的项
我找不到一种标准方法来禁用Qt组合框中的单个项。在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
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 );