ダイアログで、 tab キーを押すと、フォーカスが別のウィジェットに変わります。 Qtでは、ウィジェットがフォーカスを失ったときのシグナルはありますか?入力が有効かどうかを確認するために使用できますか?そうでない場合、フォーカスを戻し、ユーザーに再入力を求めることができますか?
シグナルはありませんが、ウィジェットがフォーカスを失ったことを知りたい場合は、ウィジェットのvoid QWidget::focusOutEvent(QFocusEvent* event)
をオーバーライドして再実装します。ウィジェットがフォーカスを失うたびに呼び出されます。ウィジェットにフォーカスを与えるには、QWidget::setFocus(Qt::FocusReason)
を使用します。
QLineEdit
またはQComboBox
の入力を検証するには、QValidator
をサブクラス化して独自のバリデーターを実装するか、既存のサブクラスの1つであるQIntValidator
、QDoubleValidator
、またはQRegExpValidator
。 QLineEdit::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
にフォーカスを設定し、ダイアログを再度表示します。
自分で信号を作成することも可能です(そして簡単です)
.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);