当它被禁用时,无法选择QAbstractItemView项

时间:2012-02-15 12:23:39

标签: qt model-view

当我设置QAbstractItemModel的标志可选但未启用时,我无法通过鼠标单击选择项目。但是内部select()函数选择对象。 这是qt错误,还是我做错了什么?

3 个答案:

答案 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);