繁体   English   中英

如何从Q(double)spinbox捕获信号

[英]How to capture signal from Q(double)spinbox

我正在通过Qt 4.7编写一个小型应用程序。 我在某些QSpinBoxes和QDoubleSpinBoxes中经常遇到问题。 我设置了editingFinished()信号,并且当我在这些字段中的任何一个字段上更改值时,它们都会发送两个信号:当旋转框失去焦点时和按下enter键时。 因此,当我按下选项卡或输入按钮时,我的程序将进行两次计算。 有什么聪明又简单的方法可以只设置lostFocus信号?

PS我是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

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

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

    // rest of your code
}

您可以覆盖keyPressEvent(QKeyEvent*)并在按下Enter键时忽略该事件。 另一种方法是重写focusOutEvent(QFocusEvent*)但要确保setFocusPolicy()设置为Qt::NoFocus以外的其他Qt::NoFocus

这是第一种方法的示例:您从QSpinBox继承并重写keyPressEvent()方法,并使其忽略Enter /返回键:

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键)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM