QTreeView:如何中止选择更改

时间:2018-05-07 16:13:26

标签: c++ qt qtreeview

我的小部件中有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 :(得分:0)

显然QTreeView会在调用currentChanged广告位时忽略选择模型的任何更新。

此处的解决方案是将广告位称为QueuedConnection,因此connect行看起来像这样:

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

这将确保选择模型选择的更改不会直接在插槽调用中发生。