在对话框中,按选项卡键时,焦点将更改为另一个小部件。在Qt中,是否有任何关于小部件失去焦点的信号?我可以用它来检查输入是否有效吗?如果没有,我可以设置焦点并要求用户重新输入吗?
答案 0 :(得分:19)
没有信号,但如果您想知道您的小部件何时失去焦点,请覆盖并重新实现小部件中的void QWidget::focusOutEvent(QFocusEvent* event)
。只要您的小部件失去焦点,就会调用它。要将焦点放在窗口小部件上,请使用QWidget::setFocus(Qt::FocusReason)
。
要验证QLineEdit
或QComboBox
中的输入,您可以继承QValidator
并实现自己的验证程序,或使用现有的子类之一QIntValidator
,{{1 },或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;
}
的{{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);