Qt 是否有办法区分编程索引更改和用户选择索引更改?

Qt 是否有办法区分编程索引更改和用户选择索引更改?,qt,Qt,我有一个QComboBox。我有两个用例。在一个用例中,组合框通过setCurrentIndex()以编程方式更改为具有新索引。在另一个用例中,用户单击并用鼠标选择一个新的组合框选择 这两种用例都会触发QComboBox::currentIndexChanged(int)信号。这是我试图移植的代码的一个主要问题。在旧框架(不是Qt)中,只有当用户选择了一个项目,而不是通过编程更改了索引时,才会调用类似的回调机制。 如何在Qt中模拟这种行为?我记得有一种方法可以暂停Qt中的触发事件,所以在更改cu

我有一个QComboBox。我有两个用例。在一个用例中,组合框通过setCurrentIndex()以编程方式更改为具有新索引。在另一个用例中,用户单击并用鼠标选择一个新的组合框选择

这两种用例都会触发QComboBox::currentIndexChanged(int)信号。这是我试图移植的代码的一个主要问题。在旧框架(不是Qt)中,只有当用户选择了一个项目,而不是通过编程更改了索引时,才会调用类似的回调机制。


如何在Qt中模拟这种行为?

我记得有一种方法可以暂停Qt中的触发事件,所以在更改
currentIndex
之前和之后,您都可以这样做

啊,这是:

bool oldState = comboBox->blockSignals(true);
comboBox->setCurrentIndex(5);
comboBox->blockSignals(oldState);

您可以监听
QComboBox::activated(int-index)
QComboBox::currentIndexChanged(int-index)
信号

如果用户更改该值,将同时发出
QComboBox::activated(int index)
QComboBox::currentIndexChanged(int index)
信号

如果该值以编程方式更改,则只会发出
QComboBox::currentIndexChanged(int index)
信号。因此,基本上,前一个信号意味着“用户将索引更改为该值”

例如:

int main(int argc, char* argv[]) {

    QComboBox* combo = new QComboBox;

    QObject::connect(combo, &QComboBox::activated, [&](int index) {
        //User changed the value
    });
}

我希望这有帮助

事实证明,这是blockSignal(),正是我所需要的。这甚至在4年后都非常棒。如果有人像我一样偶然发现了这一点,pyqt5的翻译是:
widget.blockSignals(True)
<代码>#更改值<代码>小部件.blockSignals(False)。