spearfire
spearfire

Reputation: 677

QTreeWidget turn off selection

By default a QTreeWidget manages the selection of rows (when you click a row it highlights it, when you click another row it highlights that and deselects the previous row), I don't want this and cant figure out how to turn it off.

Upvotes: 4

Views: 7567

Answers (2)

无名小路
无名小路

Reputation: 4317

Thanks for the answer above, I think the Python version is (^ ^):

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

Upvotes: 5

serge_gubenko
serge_gubenko

Reputation: 20482

you can use setSelectionMode of the QAbstractItemView class (which QTreeWidget is inherited from) to set no selection mode to the component. Something like this (sorry, code in C++):

yourtreeView->setSelectionMode(QAbstractItemView::NoSelection);

In this case items would not get selected but you still will see focus rectangle around them. To fix this you can set your widget to not accept focus by calling:

yourtreeView->setFocusPolicy(Qt::NoFocus);

if your tree widget has to accept focus but should not be drawing focus rectangles you can use custom item delegate and remove State_HasFocus state from the item's state before drawing it. Something like this:

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

Upvotes: 8

Related Questions