在我的应用程序中,我想在满足某些条件时禁用QComboBox中的某些项目(即不可选择,当鼠标悬停在上面时没有高光,文本显示为灰色)。
我确实发现有人在这里问了同样的问题:Disable Item in 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();
}
答案 0 :(得分:17)
上面评论中的答案似乎是在讨论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();
}
答案 1 :(得分:4)
这是@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);
}
答案 2 :(得分:-3)
qsi = QtGui.QStandardItem("Can't touch this")
qsi.setEnabled(False)
self.comboBox.model().appendRow(qsi)