Seite 1 von 1
QWidget.hasFocus als Signal
Verfasst: Dienstag 29. Juni 2010, 22:00
von Shaldy
Moin!
Ich hab in der Qt Klassenreferenz gelesen, dass QWidget die Funktion hasFocus hat. Ich würde diese Funktion gerne als Signal mit einem Slot verbinden.
Wie mache ich das?
Re: QWidget.hasFocus als Signal
Verfasst: Mittwoch 30. Juni 2010, 03:37
von jerch
Das geht nicht direkt, da hasFocus() kein Signal ist. Über den Umweg eines neuen Signales gehts:
Code: Alles auswählen
class T(QWidget):
newSig = pyqtSignal() # neues Signal anlegen
def __init__(self):
...
self.newSig.connect(zielObjekt.methode) # Signal mit Zielfunktion verbinden
...
# irgendwo im Code dann
if self.hasFocus(): self.newSig.emit() # einfach auf den Rückgabewert von hasFocus() testen und für ``True`` das neue Signal emittieren
Allerdings bin ich mir nicht sicher, ob Du nicht eigentlich das QFocusEvent suchst, um auf einen wechselnden Focus zu reagieren...
Re: QWidget.hasFocus als Signal
Verfasst: Mittwoch 30. Juni 2010, 14:35
von Shaldy
Also ich habe ein LineEdit Widget. Da steht standardmäßig "Benutzername" drin. Sobald man aber in das Feld klickt, um etwas einzugeben, soll das Feld leer sein.
Das wollte ich bezwecken ^^
Re: QWidget.hasFocus als Signal
Verfasst: Mittwoch 30. Juni 2010, 16:16
von lunar
Code: Alles auswählen
QApplication.instance().focusChanged.connect(lambda old, new: new is my_line_edit and my_line_edit.clear())
Natürlich musst Du das ausbauen, um z.B. zu verhindern, dass das Feld geleert wird, wenn bereits etwas darin steht. Aber das Prinzip ist wohl klar, hoffe ich.
Re: QWidget.hasFocus als Signal
Verfasst: Mittwoch 30. Juni 2010, 21:58
von Shaldy
Danke schonmal, aber es wäre mir sehr hilfreich, wenn du diese Codezeile etwas erläutern könntest, damit ich nicht einfach CopyPaste mache ^^"
Re: QWidget.hasFocus als Signal
Verfasst: Donnerstag 1. Juli 2010, 07:33
von lunar
Die lambda-Funktion dient als Slot für das "focusChanged"-Signal der Anwendung. Sie prüft dann, ob das Steuerelement, welches dem Wechsel des Fokus denselben erhalten hat, eben jenes QLineEdit ist. Falls ja, wird der Text des LineEdit gelöscht. Der Rest steht in der Dokumentation. „Trickreich“ daran ist allenfalls die Verwendung des "and"-Operators. Dieser dient zwar eigentlich zur logischen Verknüpfung. Da aber der rechte Ausdruck gar nicht ausgewertet wird, wenn der linke bereits falsch ergibt (nennt sich Short-Circuit-Evaluation), kann man ihn auch als Wächter missbrauchen. In einer vollwertigen Funktion würde man natürlich ein "if"-Ausdruck nutzen, aber das ist innerhalb von Lambdas nicht möglich.
Re: QWidget.hasFocus als Signal
Verfasst: Donnerstag 1. Juli 2010, 22:19
von Shaldy
Oho, tatsächlich sehr trickreich

Danke für die Erläuterung, das war sehr hilfreich!
Problem gelöst.