QTreeView: как отменить изменение выбора - PullRequest
0 голосов
/ 07 мая 2018

У меня есть QTreeView в моем виджете. Когда элемент выбран в представлении, у меня есть обработчик сигнала, который обновляет серию информационных виджетов в подробном окне о выбранном товаре. Затем пользователь может отредактировать детали элемента и зафиксировать возвращается к модели.

Если данные в подробном ракурсе были отредактированы при изменении этого выбора случается, я представляю диалоговое окно подтверждения пользователю перед заменой данных когда новый элемент выбран. Если пользователь отменяет, я хочу установить выбор дерево вернулось к тому, что было раньше.

Мой слот подключен так:

auto selection_model = treeview->selectionModel();
connect(
    selection_model, &QItemSelectionModel::currentChanged,
    this, &Editor::on_tree_selection_changed
)

Внутри моего слота код структурирован следующим образом:

void on_tree_selection_changed(QModelIndex const& index, QModelIndex const& previous)
{
    if(not confirm_editor_discard()) 
    { 
        // user does not want to override current edits
        log.trace("cancel item selection change");
        using SF = QItemSelectionModel::SelectionFlags;
        auto sm = treeview->selectionModel();
        sm->setCurrentIndex(previous, SF::SelectCurrent | SF::Rows);
    }
    else
    {
        // user wants to discard, so update the details view.
        log.trace("discard pending edits");
        set_details_from_model(index);
    }
}

Однако установка текущего индекса на предыдущий, похоже, не воздействовать на TreeView; он по-прежнему отображает вновь выбранный элемент как выбранный, и интерфейс становится непоследовательным, поскольку отображаемый в деталях элемент не тот, который показан как выбранный в дереве.

Предполагаемое поведение - повторно выбрать ранее выбранный элемент, как будто нет новый выбор был сделан вообще.

1 Ответ

0 голосов
/ 07 мая 2018

Очевидно, QTreeView игнорирует любые обновления из модели выбора, когда вызывается слот currentChanged.

Решением здесь было назвать слот QueuedConnection, поэтому строка connect будет выглядеть следующим образом:

connect(
    selection_model, &QItemSelectionModel::currentChanged,
    this, &Editor::on_tree_selection_changed,
    Qt::QueuedConnection // <-- connection must be queued. 
)

Это гарантирует, что изменение выбора модели выбора не произойдет непосредственно внутри вызова слота.

...