Причина
Вызов QTreeView::mousePressEvent(event)
очищает выбор при нажатии на невыбираемый элемент, если режим выбора установлен на QAbstractItemView::SingleSelection
.
Решение
Мое решение было бы либо:
- Установите режим выбора на
QAbstractItemView::MultiSelection
,
или (в случае, если это нежелательно):
- Переопределить события мыши в подклассе QTreeWidget , чтобы обойти поведение по умолчанию.
Примечание: В любом случае используйте сигнал QItemSelectionModel::selectionChanged
, чтобы получить список выбранных элементов.
* +1032 * Пример
Ниже приведен пример повторной реализации событий мыши в MyTreeWidget , предотвращающий выбор очищаемых щелчков на неотбираемом элементе. Верхний элемент развернут / свернут при двойном щелчке:
void MyTreeWidget::mousePressEvent(QMouseEvent *event)
{
if (indexAt(event->pos())->flags() & Qt::ItemIsSelectable)
QTreeWidget::mousePressEvent(event);
}
void MyTreeWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
QTreeWidget::mouseDoubleClickEvent(event);
QTreeWidgetItem *item = itemAt(event->pos());
if (item && item->childCount())
item->setExpanded(!item->isExpanded());
}
Модифицированная описанным способом версия предоставленного примера доступна на GitHub .
Улучшения
Особая благодарность @eyllanesc за то, что этот пример стал более водонепроницаемым:
- добавив проверку, если
item
не NULL
- с заменой
itemAt
на indexAt