在对话框中,当按下 tab 键时,焦点会转移到另一个小部件。在 Qt 中,是否有任何信号可以指示小部件失去焦点? 我能否使用它来检查输入是否有效? 如果不行,我能否将焦点设置回来并要求用户重新输入?
如果您想知道小部件何时失去焦点,即使没有信号,也可以覆盖并重新实现void QWidget::focusOutEvent(QFocusEvent* event)
。这将在小部件失去焦点时被调用。要将焦点放在小部件上,请使用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 文件)
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);
QLineEdit
失去焦点感兴趣,那么QLineEdit::editingFinished()
信号可以捕获该事件。 - waldyrious