我通常使用 .net 框架,最近有机会参与一个使用 C++/Qt 的项目。在这个背景下,我想要实现以下功能:(为了简化问题,假设我有一个 ListView 和一个 Textbox/Textedit)
非常感谢您的帮助!
- 如果我选择 ListView 中的一个项目 -> 在 textedit 中显示相应的文本 (已完成)
- 如果我编辑文本并点击列表中的另一个项目 -> 显示一个对话框询问是否保存或取消更改 (已完成)。文本编辑器从列表中接收到一个信号,告诉它所选的项目已经更改。
- 如果用户按保存 -> 将其保存并刷新列表中的项目,新的项目被选中 (已完成)
- 如果用户按取消 -> 不要选择用户点击的其他项目 (这就是我的问题所在)
基本上我看到两种解决方案(可能还有更多):
- 从textedit发送一个信号回到列表,告诉列表恢复先前的选择。我个人不太喜欢这个解决方案,因为它们之间的耦合更强了(列表向textedit发送信号,现在也是反过来)。而且,这种“强制”选择恢复可能会再次触发后续信号,这些信号必须再次被阻止...
- 一个更好的解决方案(我认为)是在信号中有一些否决机制。我可以想象列表发送两个信号:
- 让我们称第一个为
aboutToChangeSelection(proposedSelection,vetoObj)
- 在操作完成后另一个:
changedSelection(newSelection)
- 让我们称第一个为
第一个信号将被发送到textedit,然后textedit最终将利用其否决权。之后,同样的信号将被发送到列表本身,根据否决权执行操作,并在实际更改选择时发送第二个信号。
在.NET世界中,有这样一种机制,借助于CancelEventArgs
的帮助。我知道.NET事件和Qt信号有着非常不同的工作原理,但是是否有任何Qt等效方法来实现相同的效果呢?非常感谢您的帮助!