2013-07-23 17 views
22

タブキーを押すと、別のウィジェットにフォーカスが変わります。 Qtでは、ウィジェットがフォーカスを失ったときのシグナルはありますか?入力を有効にするかどうかを確認するために使用できますか?そうでない場合は、フォーカスを元に戻して、ユーザーに再入力を要求することはできますか?ウィジェットがフォーカスを失ったときの信号は何ですか?

+0

'QLineEdit'フォーカスを失うことに興味があるなら、' QLineEdit :: editingFinished() 'シグナルはそのイベントを捕捉します。 – waldyrious

答えて

18

ウィジェットのフォーカスが失われたことを知りたい場合は、ウィジェット内でvoid QWidget::focusOutEvent(QFocusEvent* event)をオーバーライドして再実装してください。ウィジェットがフォーカスを失ったときに呼び出されます。ウィジェットにフォーカスを当てるには、QWidget::setFocus(Qt::FocusReason)を使います。

QLineEditに入力を検証するために、または QComboBoxあなたは QValidatorをサブクラス化し、独自のバリデータを実装する、または既存のサブクラスの1、 QIntValidatorQDoubleValidator、または QRegExpValidatorを使用することができます。バリデータを QLineEdit::setValidator(const QValidator*)QComboBox::setValidator(const QValidator*)にそれぞれ設定します。

あなたはモーダルダイアログボックスの内容を確認したい場合は、一つの方法は、このような実装でQDialog::exec()を上書きするために、次のようになります。

int MyDialog::exec() { 
    while (true) { 
    if (QDialog::exec() == QDialog::Rejected) { 
     return QDialog::Rejected; 
    } 
    if (validate()) { 
     return QDialog::Accepted; 
    } 
    } 
} 

bool MyDialog::validate() { 
    if (lineEdit->text().isEmpty()) { 
    QMessageBox::critical(this, "Invalid value", "The specified value is not valid"); 
    lineEdit->setFocus(); 
    lineEdit->selectAll(); 
    return false; 
    } 
    return true; 
} 

それは、ユーザがOKでダイアログを閉じることができません。ダイアログの内容が正常に検証されない限り、[Accepted]ロールを持つ他のボタンをクリックします。この例では、ダイアログにはというQLineEditという名前が付けられており、その内容は空でないことが確認されます。validate関数はその内容が空でないことを確認します。表示されている場合は、フォーカスをQLineEditに設定し、ダイアログを再度表示します。

+10

実際には、シグナル['QApplication :: focusChanged'](http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged)があります。 – sashoalm

+0

[sashoalm](https://stackoverflow.com/users/492336/sashoalm)の潔白なコメントは、受け入れられる回答でなければなりません。もちろん、それはそのようには動作しません。 [この重複した質問]の[この類似の回答](https://stackoverflow.com/a/321677/2809027)[https://stackoverflow.com/questions/321656/get-a-notification-event-signal -w -a-qt-widget-gets-focus)を使用してください。 '' –

6

class FocusWatcher : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit FocusWatcher(QObject* parent = nullptr) : QObject(parent) 
    { 
     if (parent) 
     parent->installEventFilter(this); 
    } 
    virtual bool eventFilter(QObject *obj, QEvent *event) override 
    { 
     Q_UNUSED(obj) 
     if (event->type() == QEvent::FocusIn) 
     emit focusChanged(true); 
     else if (event->type() == QEvent::FocusOut) 
     emit focusChanged(false); 

     return false; 
    } 

Q_SIGNALS: 
    void focusChanged(bool in); 
}; 

(MOCを含めることを忘れないでください).cppファイルでは自分で

を信号を作成することも可能(かつ簡単)であり、それを接続するために:

connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething); 
関連する問題