簡體   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