5

我通常习惯于 .net 框架,最近有机会使用 C++/Qt 进行项目。在这种情况下,我想实现以下功能:(为了简化事情,假设我有一个 ListView 和一个 Textbox/Textedit)

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

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

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

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

在 .NET 世界中存在这样一种机制,在 .NET 的帮助下CancelEventArgs。我知道 .NET 事件和 Qt 信号具有完全不同的工作原理,但是有没有任何 Qt 等效于实现相同的效果?

非常感谢您的帮助!

4

2 回答 2

1

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

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

现在有一个问题。哪个信号会先收到??文档中未指定,可以按任意顺序排列。如果用户在 item 上A,并单击 item B,您希望 lastitem 成为A当前项目,并且当前项目B在您正在处理的那一刻itemPressed。所以你currentItemChanged要先处理。幸运的是,您可以使用Qt::DirectConnectionforcurrentItemChanged和 use Qt::QueuedConnectionforitemPressed

选择:

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

于 2012-10-26T12:40:46.853 回答
0

对此不是 100% 确定,但您可以覆盖QCoreApplication::notify( QObject * receiver, QEvent * event )并尝试找到正确的事件并调用ignore()它。为了告诉何时忽略,您可以添加一个新的QEvent子类,将目标元素指针嵌入其中并使其充当您的否决事件 - 如果收到,那么您知道您将忽略该特定事件的某种特定类型的下一个事件目的。

于 2012-10-26T12:22:03.050 回答