QSpinbox редактированиеFInished сигнал при нажатии стрелки вверх/вниз

Я просмотрел много сообщений о редактировании сигналов QSpinBoxFinished и valueChanged, но не смог решить свою проблему, т.е.

  1. Я хочу, чтобы сигнал editFinished испускался, когда пользователь вводит любое значение и нажимает «Ввод». [ГОТОВО]
  2. Пользователь может изменить значение с помощью стрелок вверх/вниз либо нажатием клавиши, либо нажатием мыши. Это можно сделать с помощью сигнала valueChange, но не с помощью editFinished.

Итак, чтобы достичь обоих, я столкнулся с проблемой. Предположим, я хочу ввести 10000, поэтому valueChanged выдается с 1, 10, 100, 1000, 10000, чего я не хочу, а должен испускать, когда пользователь нажимает ввод после ввода 10000 Таким образом, это делается путем избегания valueChanged и подключения к &QAbstractSpinbox::editingFinished.

    connect(ui->spinBox, &QSpinBox::editingFinished,
            this, [&]()
    {
        ui->label->setText(QString::number(ui->spinBox->value()));
    });

Но я хочу, чтобы стрелки вверх/вниз тоже работали. поэтому для этого снова требуется valueChanged.

Есть ли какие-либо средства для достижения этого напрямую, вместо добавления моего собственного класса spinbox и переопределения событий для щелчка/нажатия стрелки вверх/вниз.

Любое предложение приветствуется.


person Sayan Bera    schedule 06.02.2020    source источник


Ответы (2)


Я думаю, вам нужно убедиться, что keyboardTracking свойство отключено (установлено в false). В большинстве случаев по умолчанию свойство имеет значение true.

Как указано в документах Qt, с keyboardTracking на false вы получите сигналы valueChanged()textChanged() в Qt 5.14+) только после нажатия Enter в поле счетчика (или если пользователь уйдет или поле потеряет фокус), а не во время текста редактируется.

person Maxim Paperno    schedule 06.02.2020
comment
@SayanBera Пожалуйста, объясните? С kayboardTracking на false вы получите сигналы valueChanged()textChanged() в Qt 5.14+) только после нажатия Enter/Tab в поле счетчика, а не во время редактирования текста. Или есть причина, по которой вы специально хотите editingFinished? - person Maxim Paperno; 06.02.2020

Непонятно почему, но это делает то, что вам нужно:

установите для свойства keyboardTracking счетчика значение false, затем выполните следующие действия:

void MainWindow::on_mySpinBox_valueChanged(int arg1)
{
    on_mySpinBox_editingFinished();
}

void MainWindow::on_mySpinBox_editingFinished()
{
    // what you need to be done, on spinbox loosing focus or arrows adjusting (and not while editing)
}
person newby    schedule 16.04.2021