Qt 小部件失去焦点时的信号是什么?

Qt 小部件失去焦点时的信号是什么?,qt,qt4,qt5,qdialog,Qt,Qt4,Qt5,Qdialog,在对话框中,当按下tab键时,焦点将切换到另一个小部件。在Qt中,当小部件失去焦点时是否有任何信号?我可以用它来检查输入是否有效吗?如果没有,我可以将焦点设置回原处并要求用户重新输入吗?没有信号,但如果您想知道小部件何时失去焦点,请在小部件中覆盖并重新实现void QWidget::focusOutEvent(QFocusEvent*事件)。它将在小部件失去焦点时调用。要使小部件具有焦点,请使用QWidget::setFocus(Qt::FocusReason) 要验证QLineEdit或QCo

在对话框中,当按下tab键时,焦点将切换到另一个小部件。在Qt中,当小部件失去焦点时是否有任何信号?我可以用它来检查输入是否有效吗?如果没有,我可以将焦点设置回原处并要求用户重新输入吗?

没有信号,但如果您想知道小部件何时失去焦点,请在小部件中覆盖并重新实现
void QWidget::focusOutEvent(QFocusEvent*事件)
。它将在小部件失去焦点时调用。要使小部件具有焦点,请使用
QWidget::setFocus(Qt::FocusReason)

要验证
QLineEdit
QComboBox
中的输入,您可以将
QValidator
子类化并实现您自己的验证器,或使用现有子类之一,
QIntValidator
QDoubleValidator
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;
}
它将不允许用户使用“确定”按钮或任何具有接受角色的其他按钮关闭对话框,除非对话框的内容已成功验证。在本例中,我假设对话框有一个名为
lineEdit
QLineEdit
,并且
validate
函数将确保其内容不是空的。如果是,它会将焦点设置到
QLineEdit
并再次显示对话框。

也可以(且更容易)自己创建信号

在.cpp中(不要忘记包含moc)

要连接它:

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

事实上,这是一个信号-。的精辟评论应该是公认的答案。当然,它不是那样工作的。换个角度考虑投票。code>如果您对失去焦点的
QLineEdit
感兴趣,则
QLineEdit::editingFinished()
信号会捕获该事件。
connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);