qt - functions - ¿Cuál es la señal para cuando un widget pierde el foco?
qwidget functions (2)
No hay señal, pero si desea saber cuándo su widget ha perdido enfoque, anule y void QWidget::focusOutEvent(QFocusEvent* event)
en su widget. Se llamará siempre que su widget haya perdido el foco. Para enfocar un widget, use QWidget::setFocus(Qt::FocusReason)
.
Para validar la entrada en un QLineEdit
o QComboBox
puede subclasificar QValidator
e implementar su propio validador, o usar una de las subclases existentes, QIntValidator
, QDoubleValidator
o QRegExpValidator
. Establezca el validador con QLineEdit::setValidator(const QValidator*)
y QComboBox::setValidator(const QValidator*)
respectivamente.
Si desea validar el contenido de un cuadro de diálogo modal, una forma sería anular QDialog::exec()
con una implementación como esta:
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;
}
No permitirá al usuario cerrar el diálogo con el botón Aceptar o cualquier otro botón con la función Aceptado a menos que el contenido del cuadro de diálogo se haya validado correctamente. En este ejemplo, supongo que el cuadro de diálogo tiene un QLineEdit
llamado lineEdit
y la función de validate
se asegurará de que su contenido no esté vacío. Si es así, establecerá el foco en QLineEdit
y mostrará el diálogo nuevamente.
En un diálogo, cuando se presiona la tecla de tabulación , el foco cambia a otro widget. En Qt, ¿hay alguna señal para cuando un widget pierde su foco? ¿Puedo usarlo para verificar si la entrada es válida o no? Si no, ¿puedo establecer el foco de regreso y pedirle al usuario que vuelva a ingresar?
También es posible (y más fácil) crear la señal usted mismo
En .cpp (no olvides incluir el 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);
};
Y para conectarlo:
connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);