Есть ли способ различать изменения программного индекса и изменения индекса выбора пользователя?

У меня есть QComboBox. У меня есть два варианта использования. В одном случае использования поле со списком программно изменяется, чтобы иметь новый индекс через setCurrentIndex (). В другом случае пользователь щелкает мышью и выбирает новое поле со списком.

оба этих варианта использования вызывают сигнал QComboBox::currentIndexChanged(int). Это серьезная проблема для кода, который я пытаюсь портировать. В старой структуре (не Qt) аналогичный механизм обратного вызова будет называться только если пользователь выбрал элемент, а не если индекс программно изменен.

Как я могу имитировать это поведение в Qt?

2 ответов


Я помню, что есть способ приостановить запуск событий в 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
    });
}

надеюсь, это поможет!