当一个小部件失去焦点时,它发出的信号是什么?

35
在对话框中,当按下 tab 键时,焦点会转移到另一个小部件。在 Qt 中,是否有任何信号可以指示小部件失去焦点? 我能否使用它来检查输入是否有效? 如果不行,我能否将焦点设置回来并要求用户重新输入?

2
如果您对 QLineEdit 失去焦点感兴趣,那么 QLineEdit::editingFinished() 信号可以捕获该事件。 - waldyrious
2个回答

25

如果您想知道小部件何时失去焦点,即使没有信号,也可以覆盖并重新实现void QWidget::focusOutEvent(QFocusEvent* event)。这将在小部件失去焦点时被调用。要将焦点放在小部件上,请使用QWidget::setFocus(Qt::FocusReason)

要在QLineEditQComboBox中验证输入,可以子类化QValidator并实现自己的验证器,或使用现有的子类之一,QIntValidatorQDoubleValidatorQRegExpValidator。分别使用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;
}

除非对话框的内容成功验证,否则它不允许用户使用“确定”按钮或带有“已接受”角色的任何其他按钮关闭对话框。在这个例子中,我假设对话框有一个名为lineEditQLineEdit并且validate函数将确保其内容不为空。如果是空的,它会将焦点设置到QLineEdit上,并再次显示对话框。


18
确实存在一个信号 - QApplication::focusChanged - sashoalm
1
sashoalm的简洁评论应该被采纳为答案。当然,事情并不是这样的。请考虑给这个类似的答案这个重复的问题中点赞。</叹气> - Cecil Curry

13

你也可以自己创建信号(这样会更容易)

在 .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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接