Параметр QTreeWidgetItem, недоступный для выбора, очищает выбор - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть QTreeWidget, и я хочу, чтобы определенные строки были недоступны для выбора, чего можно достичь с помощью QTreeWidgetItem::setFlags(treeWidgetItem->flags() & ~Qt::ItemIsSelectable).

Проблема в том, что у меня уже есть выбранная строка, и позже я нажимаю на строку, которую нельзя выбрать, selectedItems() возвращает пустой список. Я хочу, чтобы выбранная строка сохраняла свой выбор, если пользователь пытается выбрать недоступную для выбора строку.

Должен ли я отслеживать выбор и обрабатывать этот сценарий в коде, или этого можно достичь как-нибудь еще. Я бы предпочел не изобретать велосипед.

Спасибо.

1 Ответ

0 голосов
/ 05 сентября 2018

Причина

Вызов QTreeView::mousePressEvent(event) очищает выбор при нажатии на невыбираемый элемент, если режим выбора установлен на QAbstractItemView::SingleSelection.

Решение

Мое решение было бы либо:

или (в случае, если это нежелательно):

  • Переопределить события мыши в подклассе 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
...