在 QAbstactItemView 中设置当前索引时如何不发出更改信号?

How to not get changed-signals to be emitted when setting the current-index in QAbstactItemView?

我正在使用我的 TreeView 和 TableView 的 setCurrentIndex() 以编程方式更改所选项目。

如果当前项目已更改,则会发出大量信号(currentChanged()currentColumnChanged 等)。

我正在收听其中一些信号,以便在用户更改选择时得到通知。

是否有 way/a 信号来区分用户选择的事件和程序选择的事件?

我尝试在视图上使用 activated()-signal,但这似乎在不同平台上表现不一样(有时只有双击才会触发激活)。

在你的插槽中,你可以使用QObject::sender() 来return QObject 给你。从那里,您应该可以通过一些方法来区分来源。

或许,您可以在进行更改时屏蔽所有信号?
QSignalBlocker or QObject::blockSignals 可以帮助:

{
    const QSignalBlocker blocker(myWidget);
    myWidget->setCurrentIndex(someIndex);
}

我最终做了什么,它适用于我的情况,因为我有一个 single-thread 应用程序,我创建了一个自定义变量 programmatic-select,我在调用 setCurrentIndex() 之前将其设置为 true .在 changeSelection()-slot 中,我检查这个变量,如果它是真的,什么也不做。

要实现这一点,非常重要的一点是使用 connection-type DirectConnection 将插槽连接到信号。在这种情况下,槽会在信号发出时同步执行,我确定我的变量值是安全的。