web-dev-qa-db-ja.com

ウィジェットがフォーカスを失ったときのシグナルは何ですか?

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

29
user1899020

シグナルはありませんが、ウィジェットがフォーカスを失ったことを知りたい場合は、ウィジェットのvoid QWidget::focusOutEvent(QFocusEvent* event)をオーバーライドして再実装します。ウィジェットがフォーカスを失うたびに呼び出されます。ウィジェットにフォーカスを与えるには、QWidget::setFocus(Qt::FocusReason)を使用します。

QLineEditまたはQComboBoxの入力を検証するには、QValidatorをサブクラス化して独自のバリデーターを実装するか、既存のサブクラスの1つであるQIntValidatorQDoubleValidator、またはQRegExpValidatorQLineEdit::setValidator(const QValidator*)およびQComboBox::setValidator(const QValidator*)でそれぞれバリデーターを設定します。

モーダルダイアログボックスの内容を検証する場合、1つの方法は、次のような実装で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という名前のlineEditがあり、validate関数はその内容が空でないことを確認します。そうである場合、QLineEditにフォーカスを設定し、ダイアログを再度表示します。

19
Daniel Hedberg

自分で信号を作成することも可能です(そして簡単です)

.cpp内(mocを含めることを忘れないでください)

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);
};

そしてそれを接続するには:

connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);