我的小部件中有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;它仍然显示新选择的项目,并且 由于细节中显示的项目是,因此界面变得不连贯 不是在树中显示的那个。
预期的行为是重新选择之前选择的项目,就像没有 根本就做出了新的选择。
答案 0 :(得分:0)
显然QTreeView
会在调用currentChanged
广告位时忽略选择模型的任何更新。
此处的解决方案是将广告位称为QueuedConnection
,因此connect
行看起来像这样:
connect(
selection_model, &QItemSelectionModel::currentChanged,
this, &Editor::on_tree_selection_changed,
Qt::QueuedConnection // <-- connection must be queued.
)
这将确保选择模型选择的更改不会直接在插槽调用中发生。