在Qt信号中取消等效事件

Phi*_*ier 5 c++ qt event-handling signals-slots

我通常习惯.net框架,最近有机会使用C++/Qt处理项目.在这个上下文中,我想实现以下功能:(为了简化事情,我可以说我有一个ListView和一个Textbox/Textedit)

  • 如果我选择ListView的项目 - >在textedit中显示相应的文本(完成)
  • 如果我编辑文本并单击列表中的其他项目 - >显示一个对话框,询问是保存还是取消更改(完成).textedit从列表中获取信号,告诉它所选项目已更改.
  • 如果用户按下保存 - >将其保存并刷新列表中的项目,则会在列表中选择用户单击的新项目(完成)
  • 如果用户按下取消 - >不要选择用户点击的其他项目(这是我的问题所在)

基本上我看到两个解决方案(可能还有更多):

  • 将信号从短信发送回列表,告诉列表恢复先前的选择.我个人不太喜欢这个解决方案,因为我必须把它们联系得更强(列表发送信号给textedit,现在也反过来).此外,这种"强制"选择恢复可能再次触发后续信号,这些信号必须再次被阻止......
  • 一个更好的解决方案(我认为)将是在信号中有一些Veto机制.我可以想象列表发送两个信号:
    • 我们打电话给第一个 aboutToChangeSelection(proposedSelection, vetoObj)
    • 行动完成后的另一个: changedSelection(newSelection)

第一个信号将被发送到textedit,然后最终将利用其否决权.在此之后,相同的信号将被发送到列表本身,根据否决权执行操作,并且如果它实际改变了选择则发送第二信号.

在.NET世界中,存在这样一种机制,借助于CancelEventArgs.我知道.NET事件和Qt信号有相当不同的工作原理,但有没有相同的Qt相同的效果?

非常感谢您的帮助!

UmN*_*obe 1

如果您使用 aQListWidget而不是 a QListView,那么您可以执行以下操作:

  • 收听信号:QListWidget::itemPressed ( QListWidgetItem * item )而不是表示该项目已更改的信号(即currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )在我的示例中)
  • 打开对话框的函数是连接到该信号的插槽。我认为不需要修改。
  • 收听信号:currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )该信号仅用于记住当前和最后一项。
  • 现在,在您的情况下,当用户设置取消时,以编程方式更改回最后一项。

现在有一个问题。首先会收到哪个信号?文档中未指定,可以按任何顺序。如果用户在某个项目上A并单击该项目B,则您希望最后一个项目处于您正在处理的A时刻,而当前项目处于B您正在处理的时刻itemPressed。所以你要先处理currentItemChanged。幸运的是,您可以使用 use Qt::DirectConnectionforcurrentItemChanged和 use Qt::QueuedConnectionforitemPressed

选择:

您可以在列表小部件上使用事件过滤器。该过滤器将执行您在几个步骤中描述的处理。如果用户单击接受,您将事件发送到列表视图。如果用户拒绝,您将阻止该事件。我不确定,但事件可能没有在过滤器中处理,这将使这种替代方案不可行。