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?
QWidget.hasFocus als Signal
Das geht nicht direkt, da hasFocus() kein Signal ist. Über den Umweg eines neuen Signales gehts:
Allerdings bin ich mir nicht sicher, ob Du nicht eigentlich das QFocusEvent suchst, um auf einen wechselnden Focus zu reagieren...
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
Code: Alles auswählen
QApplication.instance().focusChanged.connect(lambda old, new: new is my_line_edit and my_line_edit.clear())
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.