QWidget.hasFocus als Signal

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

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?
Dies ist keine Signatur!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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...
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

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 ^^
Dies ist keine Signatur!
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.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Danke schonmal, aber es wäre mir sehr hilfreich, wenn du diese Codezeile etwas erläutern könntest, damit ich nicht einfach CopyPaste mache ^^"
Dies ist keine Signatur!
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.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Oho, tatsächlich sehr trickreich :D :D
Danke für die Erläuterung, das war sehr hilfreich!

Problem gelöst.
Dies ist keine Signatur!
Antworten