当我设置QAbstractItemModel的标志可选但未启用时,我无法通过鼠标单击选择项目。但是内部select()函数选择对象。 这是qt错误,还是我做错了什么?
答案 0 :(得分:3)
根据我的理解,你想要“禁用”该项目,但同时,能够选择它。在模型上伪造它很容易。
if ( role == Qt::BackgroundRole ){
return QVariant(QApplication::palette()->color(QPalette::Inactive, QPalette::Window );
}
这会将您的项目描绘为灰色,您仍然可以选择它。
答案 1 :(得分:2)
你做错了什么。如果禁用窗口小部件,它将显示为灰色,并且不会接收用户鼠标单击和键盘输入。
答案 2 :(得分:0)
我刚遇到类似的问题(我需要复制禁用的项目)。这是为禁用项设置正确样式的解决方案(不忽略任何样式表)。
为您的模型创建自定义项目委托。
/// Returns false only if item needs to be rendered as disabled.
bool isIndexEnabled(const QModelIndex &index)
{
// Implement this function.
}
class ItemDelegate : public QStyledItemDelegate {
public:
explicit ItemDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent) {}
protected:
void initStyleOption(
QStyleOptionItemView *option, const QModelIndex &index) const override
{
QStyledItemDelegate::initStyleOption(option, index);
if (!isIndexEnabled(index))
option->state &= ~QStyle::State_Enabled;
}
};
将新项目委托设置为您的模型。
auto itemDelegate = new ItemDelegate(model)
model->setItemDelegate(itemDelegate);