resizeevent functions qt qt4 qt5 qdialog

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