Как захватить сигнал с Q (двойной) спинбокс - PullRequest
0 голосов
/ 23 октября 2011

Я пишу мини-приложение с помощью Qt 4.7. И у меня есть повторяющаяся проблема с некоторыми QSpinBoxes и QDoubleSpinBoxes. Я устанавливаю сигнал editFinished (), и когда я изменяю значение в любом из этих полей, они посылают два сигнала: когда спинбокс теряет фокус и когда нажимается ввод. Поэтому, когда я нажимаю вкладку или кнопку ввода, моя программа выполняет вычисления дважды. Есть ли какой-нибудь умный и простой способ установить только сигнал lostFocus?

P.S. Я новичок в Qt. Извините за мой английский, я все еще учусь.

редактирование:

Большое спасибо за помощь netrom!

Но это все еще что-то не так ... Должно ли это выглядеть ниже Я могу скомпилировать его и запустить, но кажется, что SpinBox все еще реагирует на кнопку Enter.

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QSpinBox>
#include <QKeyEvent>

namespace Ui {
    class SpinBox;
    class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:
    void on_spinBox_editingFinished();
};

class SpinBox : public QSpinBox
{
  Q_OBJECT

public:
  explicit SpinBox(QWidget *parent = 0) : QSpinBox(parent) { }

protected:
  void keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
    case Qt::Key_Return:
    case Qt::Key_Enter:
      return;

    default: break;
    }

    QSpinBox::keyPressEvent(event);
  }
};
#endif // DIALOG_H

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Вы можете попробовать проверить, имеет ли виджет spinbox фокус в начале вашего слота, он должен сказать вам, был ли сигнал editingFinished() результатом нажатия клавиши Enter / Return или потерей фокуса.

void Dialog::on_spinBox_editingFinished() {
    if(ui->spinBox->hasFocus()) 
        return;   

    // rest of your code
}
0 голосов
/ 23 октября 2011

Вы можете переопределить keyPressEvent(QKeyEvent*) и игнорировать событие при нажатии клавиши ввода.Другой способ сделать это - переопределить focusOutEvent(QFocusEvent*), но убедитесь, что для setFocusPolicy() установлено значение, отличное от Qt::NoFocus.

Вот пример первого метода: Выунаследуйте от QSpinBox и переопределите метод keyPressEvent() и заставьте его игнорировать клавишу ввода / возврата:

class SpinBox : public QSpinBox {
  Q_OBJECT

public:
  SpinBox(QWidget *parent = NULL) : QSpinBox(parent) { }

protected:
  void keyPressEvent(QKeyEvent *event) {
    switch (event->key()) {
    case Qt::Key_Return:
    case Qt::Key_Enter:
      return;

    default: break;
    }

    QSpinBox::keyPressEvent(event);    
  }
};

Теперь просто используйте сигнал editingFinished(), который будет дан только тогда, когда фокус потеряннапример, клавиша мыши или клавиши табуляции).

...