2012-04-19 4 views
0

Предположим, у меня есть QSpinBox со значением 123.45 в нем. Если я вручную отредактирую его и начну стирать пять, valueChanged будет запущен для значения 123.4. Случается снова, если я продолжаю стирать четыре.QSpinBox ValueChanged уволен много раз

И он также срабатывает, если я нажимаю кнопку ввода после завершения редактирования.

Я думаю, проблема в том, что я должен использовать void QAbstractSpinBox :: editingFinished() вместо valueChanged, но он выглядит так, как valueChanged был рекомендованным подходом, поскольку в моем oppinion есть еще много примеров использования ans, поэтому я хочу быть уверенным об этом.

Любая идея?

+0

Еще одна вещь о различии между 'editFinished' и' valueChanged' с отключенной 'keyboardTracking'. 'editFinished' испускается только тогда, когда фокус потерян. Пользователь может установить фокус на 'QSpinBox' и начать прокрутку. Если вам нужно что-то обновить во время прокрутки, используйте 'valueChanged'. В большинстве случаев это предпочтительный подход. – Vladislav

ответ

0

И наконец, я нашел keyboardTracking property в документации Qt. Легко устанавливается и работает как шарм!

+3

Пожалуйста, добавьте минимальную информацию в свой ответ, чтобы люди могли понять, не указав ссылку. – HWende

+3

Ссылка была переделана. Попробуйте http://doc-snapshot.qt-project.org/4.8/qabstractspinbox.html#keyboardTracking-prop. И суммировать, со страницы: Если отслеживание клавиатуры отключено, спинбокс не выдаёт сигнал valueChanged() во время ввода. Он излучает сигнал позже, когда нажата клавиша возврата, когда теряется фокус клавиатуры или когда используются другие функции спин-бокса, например, нажатие клавиши со стрелкой. –

+1

Дополнительная морщина, которая может смутить кого-то. Даже при использовании редактируемого сигнала он может срабатывать дважды при отладке своего обработчика в MS Visual Studio. Когда вы нажмете return, и если вы установили разрыв отладки, обработчик снова будет вызван из-за изменения фокуса. – LRaiz

0

На мой взгляд, для использования любого сигнала несколько элементов формы Qt имеют как editingFinished, так и сигнал ????Changed.

  • QLineEdit
  • QAbstractSpinBox подклассы:
    • QDateTimeEdit
    • QDoubleSpinBox
    • QSpinBox

Мульти-линия QTextEdit имеет только textChanged в качестве прижимного возврата создает новую строку, не перемещая фокус.

0

Возможно, вы захотите реализовать обработчик ключей, чтобы сделать что-то только , если, например, нажата клавиша ввода. Это, конечно, не так быстро, как ValueChanged() , но это могло бы быть более эффективным ...

может выглядеть следующим образом

void MyWidget::keyPressEvent(QKeyEvent *event) 
{ 
    int key = event->key(); 

    switch (key) { 
     case Qt::Key_Return: 
     case Qt::Key_Enter: { 
      this->start(); 
      break; 
     } 
     case Qt::Key_Escape: { 
      this->close(); 
      break; 
     } 
     default: 
      QWidget::keyPressEvent(event); 
    } 
} 

Вы бы осуществить это не в своем собственном классе MySpinBox, , но в родительский класс. Ключ ввода передается из QSpinBox в его родительский, поскольку он не обрабатывается. Это то, что делается в конце функции, если ключ не обрабатывается MyWidget. Затем он передается базовому классу.