QTreeWidget 关闭选择功能
默认情况下,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);