21

我找不到在 Qt 组合框中禁用单个项目的标准方法。在我缺少的 Qt 中是否有这样做的工具?

4

4 回答 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 回答