有没有办法区分程序化索引更改和用户选择索引更改?

Ele*_*rks 9 qt

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

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

我怎样才能在Qt中模仿这种行为?

xar*_*xer 13

你可以听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
    });
}
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助!


Ole*_*pin 9

我记得有一种方法可以暂停Qt中的触发事件,所以你可以在改变之前和之后做到这一点currentIndex.

啊,这里是:

bool oldState = comboBox->blockSignals(true);
comboBox->setCurrentIndex(5);
comboBox->blockSignals(oldState);
Run Code Online (Sandbox Code Playgroud)