QTreeWidget 关闭选择功能

4 投票
2 回答
7113 浏览
提问于 2025-04-15 17:50

默认情况下,QTreeWidget 会管理行的选择,也就是说,当你点击一行时,它会高亮显示那一行;如果你再点击另一行,它会高亮显示新点击的那一行,同时取消之前那一行的高亮。我不想要这个功能,但我不知道怎么关闭它。

2 个回答

4

感谢上面的回答,我觉得Python的版本是这样的(^ ^):

yourtreeView.setSelectionMode(QAbstractItemView.NoSelection)
yourtreeView.setFocusPolicy(QtCore.Qt.NoFocus)
8

你可以使用setSelectionMode这个方法,它属于QAbstractItemView类(而QTreeWidget是从这个类继承来的),来设置组件为不选择模式。大概是这样的(抱歉,代码是C++写的):

yourtreeView->setSelectionMode(QAbstractItemView::NoSelection);

在这种情况下,项目不会被选中,但你仍然会看到它们周围有一个焦点矩形。要解决这个问题,你可以通过调用以下方法来设置你的控件不接受焦点:

yourtreeView->setFocusPolicy(Qt::NoFocus);

如果你的树形控件必须接受焦点,但又不想显示焦点矩形,你可以使用自定义项代理,并在绘制之前从项的状态中移除State_HasFocus状态。大概是这样的:

class NoFocusDelegate : public QStyledItemDelegate
{
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};

void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
    QStyleOptionViewItem itemOption(option);
    if (itemOption.state & QStyle::State_HasFocus)
        itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    QStyledItemDelegate::paint(painter, itemOption, index);
}

....

NoFocusDelegate* delegate = new NoFocusDelegate();
yourtreeView->setItemDelegate(delegate);

撰写回答