gpt4 book ai didi

c++ - Qt Signal Slot Architecture 不需要的无限循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:26 26 4
gpt4 key购买 nike

我对 qt 信号槽系统有问题。

首先,我创建了一个名为 System in Singleton 模式的类,因此我可以在需要的地方访问它的实例。系统有信号 SelectionChanged。

我有一个列表小部件,我正在将它的 itemSelectionChanged 信号连接到我的名为 onSelectionChanged 的​​自定义插槽。在 onSelectionChanged 插槽中,我发出系统的 SelectionChanged 信号。目前还没有问题。

在我的软件设计中,许多 GUI 小部件或自定义类可以使用对象的选择,并且系统的 SelectionChanged 信号可以由列表小部件以外的小部件发出。

所以我在列表小部件中创建了一个名为 OnSystemSelectionChanged 的​​插槽,然后将其连接到系统的 SelectionChanged 信号。 OnSystemSelectionChangedSlot 是这样的。

void MyListWidget::OnSystemSelectionChanged(QObject *sender)
{
if (sender == this) return;
// Then I want to get a list of selected objects and set them as selection of this widget like this:
this->SetSelection(System::Instance()->GetSelectedObjects());
}

但问题是当我开始设置列表小部件的选定项目时,它将发出 itemSelectionChanged 信号并且我的 onSelectionChanged 插槽将被调用。然后插槽将发出系统的 SelectionChanged 信号,然后 OnSystemSelectionChanged 也将被调用。它会通过 sender 参数停止,但没有立即设置列表小部件的选定项目的方法。

我怎样才能解决这个问题。

我希望我确实很好地解释了我的问题。提前致谢。

编辑:拼写和语法错误已更正。

最佳答案

在 Qt 中有几种方法可以处理这个问题。

成语

  1. 将多个 View 与一个基础模型结合使用。这会自动处理对多个 View 控件的更改传播,您不需要做任何额外的事情。您可以使用 QDataWidgetMapper将“普通旧”小部件链接到模型中的数据元素。我想说这应该是首选的做事方式。无论如何,拥有所有 UI 的基础模型是朝着良好软件设计方向迈出的一步。

  2. 在数据模型之间传播更改时,同时实现 DisplayRoleEditRole。这些 View 名义上将使用其中一个角色(例如 EditRole)修改模型,而您可以通过编程方式使用另一个角色(例如 DisplayRole)修改模型>).您在自己的插槽中处理来自模型的 dataChanged 信号,正确处理角色,并在具有其他角色的其他模型上调用 setData 。这可以防止循环。

  3. 对于不是 QAbstractItemView 的控件,实现两个信号:一个在发生任何变化时发出,另一个仅在基于键盘/鼠标输入的变化时发出。这是QAbstractButton暴露的接口(interface),例如:toggled(bool)信号是前者,clicked()是后者。然后,您仅连接到基于输入的信号。

    您自己的代码必须将编程更改传播到所有互连的控件,因为从您的代码更改一个控件不会修改其他控件。这应该不是问题,因为设计良好的代码应该从其余代码中封装 UI 控件的实现细节。因此,您的对话框/窗口类将以一种与显示特定属性的控件数量无关的方式公开其属性。

Hackish 让我们希望他们不会成为成语

  1. 使用标志抑制信号发射 ( Bartosz's answer )。

  2. 在更改期间断开信号/槽连接 (Bartosz's answer)。

  3. 使用QObject::blockSignals()

关于c++ - Qt Signal Slot Architecture 不需要的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com