2011-10-23 8 views
0

Qt 4.7を使用してミニアプリケーションを作成しています。私はいくつかのQSpinBoxesとQDoubleSpinBoxesに再発する問題があります。私はeditingFinished()シグナルを設定し、これらのフィールドの値を変更すると、スピンボックスがフォーカスを失ったときとEnterを押したときの2つの信号を送ります。だから私がタブまたはEnterボタンを押すと、私のプログラムは計算を2回行います。 lostFocusシグナルだけを設定するスマートで簡単な方法はありますか?Q(ダブル)スピンボックスから信号をキャプチャする方法

P.S. 私は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 
+0

実装コードも表示できますか? SpinBoxの使い方を確認する必要があります。 –

+0

あります: void Dialog :: on_spinBox_editingFinished() { } – Neru

+0

スピンボックスがSpinBox(オーバーライドタイプ)のタイプであることは確かですか?私はあなたがUIクリエイターを使用しているので、代わりに通常のQSpinBoxを使用している可能性があるので、動作しません。 –

答えて

1

スピンボックスウィジェットがあなたのスロットの始めにフォーカスを持っているかどうかを調べることができます。シグナルがEnter/Returnキーの結果であるか、フォーカスが失われたのかを教えてください。

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

    // rest of your code 
} 
0

あなたはkeyPressEvent(QKeyEvent*)を無効にし、入力が押されたときにイベントを無視することができます。もう1つの方法は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()信号を使用しますフォーカスは失われます(たとえば、マウスまたはタブキーを使用して)。

+0

あなたが書いたこの方法を実装しようとしました。不幸にも結果なし。私は何をすべきか説明できますか? – Neru

+0

私はこの例が役立つことを願っています。 –

+0

多くのことを助けてくれますが、私は間違ったことをしました... – Neru

関連する問題