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

标签 c++ qt signals-slots qspinbox

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

附言 我是 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

最佳答案

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

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

    // rest of your code
}

关于c++ - 如何从 Q(double)spinbox 捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868036/

相关文章:

c# - 为什么 C# 运算符重载必须是静态的?

c++ - 是否可以从 qt QColumnView 中删除预览小部件?

c++ - 在 mac 上执行 .app 时,fstream 和 qfile 不创建文件

qt - Qt:事件是否按顺序处理?

c++ - 类对象也管理树结构?

c++ - 如何防止以 A 类之外的任何其他方式制作 B 类对象

c++ - 如果从QRunnable或其他线程调用Qt信号和插槽,则它们不起作用

c++ - 多线程应用程序中的槽执行策略

c++ - LD_PRELOAD 仅适用于 malloc,不是免费的

c++ - 当同一个信号可以来自多个地方时使用 Qt 的信号和槽