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

时间:2013-07-23 18:22:59

标签: qt qt4 qt5 qdialog

在对话框中,按选项卡键时,焦点将更改为另一个小部件。在Qt中,是否有任何关于小部件失去焦点的信号?我可以用它来检查输入是否有效吗?如果没有,我可以设置焦点并要求用户重新输入吗?

2 个答案:

答案 0 :(得分:19)

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

要验证QLineEditQComboBox中的输入,您可以继承QValidator并实现自己的验证程序,或使用现有的子类之一QIntValidator,{{1 },或QDoubleValidator。将验证器分别设置为QRegExpValidatorQLineEdit::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; } 的{​​{1}},QLineEdit函数将确保其内容不为空。如果是,则将焦点设置为lineEdit并再次显示对话框。

答案 1 :(得分:7)

自己创建信号也是可能的(也更容易)

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