Есть ли способ различать изменения программного индекса и изменения индекса выбора пользователя?
У меня есть 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
});
}
надеюсь, это поможет!