我找不到在 Qt 组合框中禁用单个项目的标准方法。在我缺少的 Qt 中是否有这样做的工具?
user195488
问问题
19521 次
4 回答
21
为什么 hack.. 我们知道模型是 QStandardItemModel...
model = dynamic_cast< QStandardItemModel * >( combobox->model() );
item = model->item( row, col );
item->setEnabled( false );
干净,优雅,没有黑客......
于 2017-08-09T19:17:41.917 回答
16
如果您的组合框使用 a QStandardItemModel
(默认情况下使用),那么您可能会远离Qt::UserRole -1
黑客(请参阅Desmond 在上面的回答中提到的博客文章):
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);
上面的代码是对我对博客文章的评论的修改和更通用的解决方案。
于 2014-02-12T21:42:39.690 回答
5
取自这里:
// 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
- 这就是使该代码起作用的原因。这不是适用于任意模型的通用解决方案。
于 2012-07-11T19:19:36.137 回答
2
您可以使用 a 的模型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);
}
于 2014-01-27T09:08:39.317 回答