如何从Q(双)旋转框捕获信号

时间:2011-10-23 18:03:13

标签: c++ qt signals-slots qspinbox

我正在通过Qt 4.7编写迷你应用程序。我有一些QSpinBoxes和QDoubleSpinBoxes的重复出现的问题。我设置了editingFinished()信号,当我更改任何这些字段中的值时,它们会发送两个信号:当旋转框失去焦点并按下输入时。因此,当我按下选项卡或输入按钮时,我的程序会进行两次计算。是否有任何智能且简单的方法来设置lostFocus信号?

P.S。 我是Qt的新手。抱歉我的英语,我还在学习。

编辑:

非常感谢你的帮助!

但它仍然是错误的...它应该在下面吗?我可以编译并运行,但似乎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 个答案:

答案 0 :(得分:1)

你可以尝试检查一下旋转框小部件是否在插槽的开头有焦点,它应该告诉你editingFinished()信号是否是输入/返回键的结果或失去焦点。

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

    // rest of your code
}

答案 1 :(得分:0)

您可以覆盖keyPressEvent(QKeyEvent*)并在按下Enter时忽略该事件。另一种方法是覆盖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()信号,该信号仅在焦点丢失时给出(例如,使用鼠标或制表键)。