1

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

PS我是Qt的新手。对不起我的英语,我还在学习。

编辑:

非常感谢您的帮助 netrom!

但是还是有问题……应该像下面这样吗?我可以编译并运行它,但 SpinBox 似乎仍然对 Enter 按钮做出反应。

对话框.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
4

2 回答 2

2

您可以尝试检查 spinbox 小部件是否在插槽开头具有焦点,它应该告诉您editingFinished()信号是 Enter/Return 键的结果还是失去焦点。

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

    // rest of your code
}
于 2011-10-24T02:33:56.490 回答
0

按下回车键时,您可以覆盖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()仅在失去焦点时才会发出的信号(例如,通过使用鼠标或 Tab 键)。

于 2011-10-23T18:12:01.213 回答