前言
QCombox 做一个下拉框,下拉框中的某些选项置为不可选状态
一、实现方法一
通过设置数据的 role 来实现。通过[virtual] bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) 函数将数据的角色设置成特定的。
QModelIndex index = ui->comboBox->model()->index(1,0);
QVariant v(0);
ui->comboBox->model()->setData(index, v, Qt::UserRole - 1);
通过更改v 的值可以控制当前 index是否选中。V>0 可选。
ItemDataRole 是标识数据的角色,具体详细的可见qt 的官方文档,常用的枚举值大概有以下:
角色 | 值 | 描述 |
---|---|---|
– | – | – |
Qt::DisplayRole | 0 | 显示 |
Qt::DecorationRole | 1 | 装饰 |
Qt::EditRole | 2 | 编辑 |
Qt::ToolTipRole | 3 | 工具提示 |
Qt::StatusTipRole | 4 | 状态栏 |
Qt::WhatsThisRole | 5 | 在“What’s This?”模式下显示的数据。 |
Qt::FontRole | 6 | 字体 |
Qt::TextAlignmentRole | 7 | 项目的文本对齐。 |
Qt::BackgroundRole | 8 | 背景画笔 |
ForegroundRole | 9 | 前景色刷 |
Qt::CheckStateRole | 10 | 此角色用于获取项的选中状态 |
Qt::AccessibleTextRole | 11 | 可访问性扩展和插件(如屏幕阅读器)所使用的文本 |
Qt::AccessibleDescriptionRole | 12 | 用于可访问性目的的项目描述 |
Qt::SizeHintRole | 13 | |
Qt::InitialSortOrderRole | 14 | 设置初始排序 |
Qt::DisplayPropertyRole | 27 | 显示属性 |
Qt::DecorationPropertyRole | 28 | 装饰属性 |
Qt:: ToolTipPropertyRole | 29 | 工具提示 |
Qt:: StatusTipPropertyRole | 30 | tip 属性 |
Qt:: WhatsThisPropertyRole | 31 | whatisthis |
Qt:: UserRole | 0x0100 | 对于用户角色,由开发人员决定使用哪种类型 |
通过设置不同的角色,得到想要的显示效果。
例如:
// index项 设置背景
ui->combox->setItemData(index, QBrush(QColor(255,100,200)), Qt::BackgroundRole);
// index项 设置字体
ui->combox->setItemData(index, QBrush(QColor(Qt::red)), Qt::ForegroundRole);
二、实现方法二
通过QCombox 组件中的QAbstractItemModel *model() const 拿到QCombox的模型,然后强转成
QStandardItemModel,然后通过行号获取到QStandardItem,设置QStandardItem的flags。
bool en=true;
auto model =qobject_cast<QStandardItemModel *>(ui->comboBox->model());
QStandardItem* item = model->item(2);
item->setFlags(en? 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(en? ui->comboBox->palette().color(QPalette::Disabled, QPalette::Text):
QVariant(),Qt::TextColorRole);