В ответе @Skilldrick мы рискуем отправлять лишние события. Если элемент уже выбран, и мы нажимаем на него снова, мы поднимаем отмененные и выбранные события. Исходя из других слушателей в вашем приложении, это может быть не то, что вы хотите.
Решение от @ eric-maeker отменяет выбор элемента, только если мы щелкнем по нему еще раз, когда он уже выбран. Строго говоря, это не ответ на исходный вопрос, который состоял в том, как отменить выбор выбранного элемента при нажатии где-то еще .
@ yassir-ennazk подходит близко, но, как отмечает @ adrian-maire, решение не является оптимальным. event->pos()
оценивается дважды. Кроме того, событие мыши всегда оценивается путем вызова QTreeView::mousePressEvent
.
Вот решение, которое я придумал, основываясь на других ответах, упомянутых выше. Если мы щелкаем в точке, где присутствует другой элемент древовидного представления, новый элемент выбирается путем пересылки события в TreeView
. Если нет, мы очищаем выбор.
Обратите внимание, что это работает и для QTreeWidget
с.
virtual void mousePressEvent(QMouseEvent* event)
{
QModelIndex item = indexAt(event->pos());
if (item.isValid())
{
QTreeView::mousePressEvent(event);
}
else
{
clearSelection();
const QModelIndex index;
selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
}
}