禁用QComboBox中的特定项

Way*_*yee 8 qt

在我的应用程序中,我想在满足某些条件时禁用QComboBox中的某些项目(即不可选择,当鼠标悬停在上面时没有突出显示,文本显示为灰色).

我确实发现有人在这里问过同样的问题:在Qt Combobox中禁用项目 但是答案中的这些解决方案似乎都没有实际工作(包括技巧).

是否有一个体面和"正确"的方式来实现这一点?

编辑:

我发现为什么设置标志不会禁用我的应用程序中的项目:由于某些原因,我必须设置样式QStyle::SH_ComboBox_UseNativePopup(请参阅https://codereview.qt-project.org/#/c/82718/).由于某些原因,此设置会阻止标记设置.有谁知道为什么,以及如何解决?包含最小测试示例(根据@Mike的答案修改):

#include <QApplication>
#include <QComboBox>
#include <QStandardItemModel>
#include <QProxyStyle>

class ComboBoxStyle : public QProxyStyle
{
public:
    int styleHint ( StyleHint hint, const QStyleOption * option = 0, const QWidget * widget = 0, QStyleHintReturn * returnData = 0 ) const override
    {
        if ( hint == QStyle::SH_ComboBox_UseNativePopup )
        {
            return 1;
        }
        return QProxyStyle::styleHint( hint, option, widget, returnData );
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QComboBox comboBox;

    // Setting this style would block the flag settings later on.
    comboBox.setStyle( new ComboBoxStyle() );

    comboBox.insertItem(0, QObject::tr("item1"));
    comboBox.insertItem(1, QObject::tr("item2"));

    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(comboBox.model());
    QStandardItem* item= model->item(1);
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled);

    comboBox.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 22

我上面评论中的答案似乎是在讨论Qt的旧版本.我已经在Qt5.4和Qt5.6上进行了测试,并且没有必要在这里设置颜色,你只需要设置和/或清除Qt::ItemIsEnabled标志,这是一个例子:

#include <QtWidgets>

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  QComboBox comboBox;
  comboBox.addItem(QObject::tr("item1"));
  comboBox.addItem(QObject::tr("item2"));
  comboBox.addItem(QObject::tr("item3"));
  QStandardItemModel *model =
      qobject_cast<QStandardItemModel *>(comboBox.model());
  Q_ASSERT(model != nullptr);
  bool disabled = true;
  QStandardItem *item = model->item(2);
  item->setFlags(disabled ? item->flags() & ~Qt::ItemIsEnabled
                          : item->flags() | Qt::ItemIsEnabled);
  comboBox.show();
  return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

  • @JonHarper,请参阅[`QComboBox :: QComboBox(QWidget*parent = Q_NULLPTR)`](https://doc.qt.io/qt-5/qcombobox.html#QComboBox)的文档.*使用默认模型**QStandardItemModel***构造具有给定父级的组合框. (4认同)
  • @JonHarper,不,这不是未记录的,请阅读[this](https://doc.qt.io/qt-5/qcombobox.html#details)。* QComboBox使用模型/视图框架为其弹出列表并存储其项目。默认情况下,** QStandardItemModel **存储项目,而QListView子类显示弹出列表*。 (3认同)

Par*_*tes 5

这是@Mike 描述的技术,包含在一个方便的实用函数中:

void SetComboBoxItemEnabled(QComboBox * comboBox, int index, bool enabled)
{
    auto * model = qobject_cast<QStandardItemModel*>(comboBox->model());
    assert(model);
    if(!model) return;

    auto * item = model->item(index);
    assert(item);
    if(!item) return;
    item->setEnabled(enabled);
}
Run Code Online (Sandbox Code Playgroud)