Wenn in einem Dialogfeld die Taste Tab gedrückt wird, wechselt der Fokus zu einem anderen Widget. Gibt es in Qt ein Signal dafür, wenn ein Widget seinen Fokus verliert? Kann ich damit überprüfen, ob die Eingabe gültig ist oder nicht? Wenn nicht, kann ich den Fokus zurückstellen und den Benutzer zur erneuten Eingabe auffordern?Was ist das Signal, wenn ein Widget den Fokus verliert?
Antwort
Es gibt kein Signal, aber wenn Sie wissen möchten, wann Ihr Widget den Fokus verloren hat, überschreiben Sie void QWidget::focusOutEvent(QFocusEvent* event)
in Ihrem Widget und implementieren es neu. Es wird immer dann aufgerufen, wenn Ihr Widget den Fokus verloren hat. Verwenden Sie QWidget::setFocus(Qt::FocusReason)
, um den Fokus auf ein Widget zu legen.
Zur Validierung Eingang in einem QLineEdit
oder QComboBox
können Sie QValidator
Unterklasse und die eigenen Validator implementieren, oder eine der bestehenden Unterklassen verwenden, QIntValidator
, QDoubleValidator
oder QRegExpValidator
. Stellen Sie den Validator mit QLineEdit::setValidator(const QValidator*)
bzw. QComboBox::setValidator(const QValidator*)
ein.
Wenn Sie den Inhalt eines modalen Dialogfeld überprüfen möchten, wäre eine Möglichkeit, QDialog::exec()
mit einer Implementierung wie diese außer Kraft zu setzen sein:
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;
}
Es wird nicht dem Benutzer ermöglichen, den Dialog mit dem OK zu schließen Schaltfläche oder eine andere Schaltfläche mit der Rolle Akzeptiert, sofern der Inhalt des Dialogfelds nicht erfolgreich validiert wurde. In diesem Beispiel nehme ich an, dass der Dialog eine QLineEdit
mit dem Namen lineEdit
hat und die validate
-Funktion sicherstellt, dass der Inhalt nicht leer ist. Wenn dies der Fall ist, wird der Fokus auf QLineEdit
gesetzt und der Dialog erneut angezeigt.
Es gibt tatsächlich ein Signal - ['QApplication :: focusChanged'] (http://qt-project.org/doc/qt-5.0/qtwidgets/qapplication.html#focusChanged). – sashoalm
[sashoalm] (https://stackoverflow.com/users/492336/ashoalm) sollte der prägnante Kommentar die akzeptierte Antwort sein. Natürlich funktioniert das nicht so. Erwägen Sie, [[diese ähnliche Antwort] ([https://stackoverflow.com/a/321677/2809027]) [bei dieser doppelten Frage] (https://stackoverflow.com/questions/321656/get-a-notification-event-signal) zu upvotieren -wenn-a-qt-widget-ruft-focus) statt. '' –
Es ist auch möglich (und einfacher), um das Signal zu erzeugen, selbst
In der CPP (nicht zu vergessen die moc enthalten)
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);
};
Und es zu verbinden:
connect(new FocusWatcher(myWidget), &FocusWatcher::focusChanged, this, &View::doSomething);
- 1. tcl/tk Widget Combobox verliert Fokus
- 2. WPF: Erkennen, wenn Fenster den Fokus verliert
- 3. Führen Sie JavaScript, wenn ein Element den Fokus verliert
- 4. Erhalten Sie eine Benachrichtigung/Ereignis/Signal, wenn ein Qt-Widget den Fokus bekommt
- 5. editText verliert nicht den Fokus
- 6. Textarea verliert den Fokus auf Mausklick?
- 7. Deaktivieren der Farbänderung, wenn die Quellenliste den Fokus verliert
- 8. Dialogfeld verliert den Fokus in Windows XP
- 9. Schließen Programmatically eine NSWindow wenn es den Fokus verliert
- 10. Kann programmgesteuert verhindert werden, dass ein Spiel angehalten wird, wenn das Fenster den Fokus verliert?
- 11. SetTimeout nicht funktioniert, wenn das Fenster des Fokus verliert
- 12. Prüfen, ob Fenster den Fokus verliert
- 13. NSWindow erhält keine Benachrichtigung, wenn es den Fokus verliert
- 14. So validieren Sie ein Feld, sobald es den Fokus verliert
- 15. Aktualisieren Sie Datenbindungen, wenn ein TextBox ändert statt Fokus verliert
- 16. Das Fenster verliert den Fokus nach Drag & Drop
- 17. TreeView verliert den Fokus nach Klickereignis
- 18. pyqt: Signal empfangen, wenn das Widget sichtbar/verborgen wird
- 19. Wie erkennt man, wenn eine Anwendung den Fokus verliert?
- 20. Wie ein Ereignis ausgelöst wird, wenn ein Textfeld den Fokus in Nsis verliert
- 21. TextBox - Kann ich das Auswahl-Highlight behalten, wenn es den Fokus verliert?
- 22. Wie kann der Hintergrund eines übergeordneten Widgets geändert werden, wenn ein untergeordnetes Widget den Fokus hat?
- 23. Vermeiden Element Unschärfe-Handler, wenn das Fenster Unschärfe aufgerufen (Browser den Fokus verliert)
- 24. Corona sdk - native.newTextField - Fokus verliert
- 25. Warum zeigt ein überschriebener Nicht-Client-Bereich den Standard, wenn das Fenster den Fokus auf Win32 verliert?
- 26. WPF Wie ändere ich die Listbox des ausgewählten Artikels, wenn das Listenfeld den Fokus verliert
- 27. Den Fokus auf ein bestimmtes TKinter-Eintrags-Widget setzen
- 28. Wie verfolgen Sie, wenn ein untergeordnetes Steuerelement den Fokus in WinForms erreicht oder verliert?
- 29. Kann eine JTable Daten speichern, wenn eine Zelle den Fokus verliert?
- 30. Wie wird ein Ereignis ausgelöst, wenn die Textkontrolle den Fokus verliert?
Wenn Sie daran interessiert sind, dass 'QLineEdit' den Fokus verliert, erfasst das' QLineEdit :: editingFinished() 'Signal dieses Ereignis. – waldyrious