【问题标题】:How can I make clicking on a QTreeView partially checked node uncheck the node?如何使单击 QTreeView 部分选中的节点取消选中该节点?
【发布时间】:2023-04-02 05:51:02
【问题描述】:

我有一个由QAbstractItemModel 子类填充的QTreeView,允许用户检查叶节点。如果检查了非叶节点的后代叶节点的适当子集,则该节点被部分检查(Qt::CheckStateRoleQt::PartiallyChecked)。

当前,如果用户点击部分选中的节点,则检查状态将更改为Qt::Checked;我希望它改为清除节点(Qt::Unchecked)。有没有办法自定义这种行为?要使用QCheckBox 控制它,我会覆盖QAbstractButton::nextCheckState(),但我找不到与QTreeView 类似的任何东西。

【问题讨论】:

    标签: qt checkbox treeview tri-state-logic


    【解决方案1】:

    在您的模型 setData 中实现所需的行为

    bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
    
    For Qt::CheckStateRole
    

    所以当你收到一个 Qt::PartiallyChecked 值时。您遍历子项以设置为 Qt::Unchecked,并更改当前项。

    【讨论】:

    • value 不是Qt::PartiallyChecked,而是Qt::Checked。这就是问题所在。
    • 所以,当您收到Qt::Checked 时,请执行此操作。有什么问题?如果需要,您甚至可以使用 data(index, role) 访问当前状态
    • 这不能区分通过鼠标单击(或按空格键)调用的setData 和其他原因,其中Qt::Checked 是想要的值。希望有更好的方法(什么代码调用setData)?
    • setData 由委托调用。实现自定义委托是获得所需内容的另一种方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多