Events: QPushButton bekommt Fokus, verliert Focus

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Hallo,

ich möchte einen Code ausführen, wenn ein QPushButton den Fokus und bekommt und einen anderen Code wenn er den Fokus verliert.
Meiner Meinung nach geht das mit focusInEvent und focusOutEvent .
Leider finde ich im Internet kein Codebeispiel wie das Event implementiert wird, könnt Ihr mir bitte helfen?
Benutzeravatar
__blackjack__
User
Beiträge: 13105
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Da ist IMHO nicht viel wofür man ein Beispiel bräuchte. Du musst halt vom `QPushbutton` ableiten und die Methode überschreiben. Wenn das Originalverhalten an der Stelle nicht verloren gehen soll, dann musst Du die Methode in der Basisklasse aufrufen. Ansonsten kannst Du da dann machen was Du willst.

Ich fände an der Stelle das ableiten müssen ungünstig, weil ich gerne mit dem Designer arbeite. Ich würde wahrscheinlich eher mit `QObject.installEventFilter()` arbeiten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

__blackjack__ hat geschrieben: Samstag 30. Mai 2020, 13:08 @PythonMarlem: Da ist IMHO nicht viel wofür man ein Beispiel bräuchte. Du musst halt vom `QPushbutton` ableiten und die Methode überschreiben.
ähm ... also ich muß ein neues Objekt vom Typ QPushbutton erstellen? *irretiertschau*
Benutzeravatar
__blackjack__
User
Beiträge: 13105
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Ja genau. Eine eigene Klasse schreiben, die von `QPushbutton` erbt und die beiden Methoden implementiert. Wenn Du mit diesen beiden Methoden etwas machen willst.

Wenn Du ohne eine abgeleitete Klasse auskommen möchtest, beispielsweise weil die GUI mit dem Designer erstellt werden soll und der ja ”nur” den `QPushbutton` kennt, und das hinzufügen von neuen Widgets zusätzliche Arbeit macht, muss man mit `QObject.installEventFilter()` arbeiten. Dafür ist in der Qt-Dokumentation auch ein Beispiel.

(Ich wüsste spontan nicht mal ob man dem Designer auch neue Widgets beibringen kann, die in Python geschrieben sind.)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Habe es geschafft;

Code: Alles auswählen

class AcccessibilityButton(QPushButton):
    def focusInEvent(self, QFocusEvent):
        self.setStyleSheet("background-color: yellow")

    def focusOutEvent(self, QFocusEvent):
        self.setStyleSheet("background-color: blue")


class MyWindow(QMainWindow):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()
        self.initMe()

    def initMe(self):
        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(300, 100))
        self.setWindowTitle('Barrierefreiheit mit Qt')
        self.setGeometry(50, 50, 300, 100)

        ButtonBetriebssystem = AcccessibilityButton("Hallo &Betriebssystem", self)

Frage: Wie finde ich die Standardfarbe eines QPushButton heraus?
Benutzeravatar
__blackjack__
User
Beiträge: 13105
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonMarlem: Ich denke Du gehst da einen falschen Weg. Das ist eher etwas für Stylesheets oder einen eigenen QStyle oder gar ein Theme.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

Aber es funktioniert, so wie ich es mir gewünscht habe:

Code: Alles auswählen

# Der aktive Schalter bekommt die Farbe Gelb.
# Sehbehinderte können so besser erkennen welches Schalter aktiv ist.
class AcccessibilityButton(QPushButton):
    def focusInEvent(self, QFocusEvent):
        self.setStyleSheet("background-color: yellow")

    def focusOutEvent(self, QFocusEvent):
        self.setStyleSheet("background-color: #E1E1E1")

class MyWindow(QMainWindow):
    def __init__(self):
        # Konstruktor von QMainWindow aufrufen
        super().__init__()
        self.initMe()

    def initMe(self):
        # Fenstergröße und Titel einstellen
        self.setMinimumSize(QSize(300, 100))
        self.setWindowTitle('Barrierefreiheit mit Qt')
        self.setGeometry(50, 50, 300, 100)

        ButtonBetriebssystem = AcccessibilityButton("Hallo &Betriebssystem", self)
        ButtonBetriebssystem.setGeometry(20, 5, 130, 30)
        ButtonBetriebssystem.setToolTip("Es wird ausgegeben wie das Betriebssystem heißt")
        ButtonBetriebssystem.setAccessibleName("Es wird ausgegeben wie das Betriebssystem heißt")
        ButtonBetriebssystem.setDefault(True)
        ButtonBetriebssystem.clicked.connect(self.BetriebssystemAbfragen)
        ButtonBetriebssystem.show()
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum nicht Stylesheet hover? Und als Experte für accessibility: dank dieses “Tricks” ist der einfache Austausch mit einem hochkontrast oder anderen farbschema Stylesheet nicht mehr möglich.
PythonMarlem
User
Beiträge: 90
Registriert: Dienstag 19. Mai 2020, 19:17
Wohnort: Dußlingen
Kontaktdaten:

__deets__ hat geschrieben: Sonntag 31. Mai 2020, 22:43 Warum nicht Stylesheet hover?
hover wird ausgeführt beim drüber schweben. Hier geht es darum, dass wenn ein QPushButton oder ein QLineEdit aktiv ist, dass das die Hintergrundfarbe Gelb wird, damit Menschen mit einer Sehbehinderung deutlich Sehen können, welcher QPushButton oder QLineEdit aktiv ist.
Und als Experte für accessibility: dank dieses “Tricks” ist der einfache Austausch mit einem hochkontrast oder anderen farbschema Stylesheet nicht mehr möglich.
Was meinst Du damit? Bitte erkläre mir Dein Problem, ich bin Python-Anfänger.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat mit Anfänger nichts zu tun. Stylesheets allgemein erlauben einfaches um stylen der Anwendung. Eben auf verschiedene Anforderungen. Der eine sieht schlecht und braucht erhöhten Kontrast. Der Andere ist farbenblind und braucht eine andere Palette.

Wenn du jetzt solche Dinge programmierst, mit fest ein kodierten werten, dann lässt sich das eben nicht mehr anpassen.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und es gibt den Focus natürlich auch als Zustand: https://doc.qt.io/qt-5/stylesheet-reference.html
Benutzeravatar
__blackjack__
User
Beiträge: 13105
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich denke das hat in der Anwendung überhaupt nichts zu suchen. Wenn ich hohen Kontrast und gelbe Farbe für die Anzeige des Elements mit dem Eingabefokus brauche, dann stelle ich das in den Systemeinstellungen durch passende Auswahl eines Themes und Farbeinstellungen ein und habe das in *allen* Anwendungen und bin da nicht auf den Autor *einer* Anwendung angewiesen, der meint mir, auch in guter Absicht, irgendwas aufzwingen zu müssen. Denn umgekehrt kotzen alle Anwender die gelb fokussierten Elemente nicht haben wollen, oder gar schlechter damit klar kommen, als mit den Einstellungen, die sie selbst vorgegeben haben.

Und wenn Du da unbedingt etwas vorgeben möchtest, dann sollte das optional und einfach sein. Eben beispielsweise das der Benutzer die Wahl hat ein von Dir erstelltes Stylesheet für die ganze Anwendung zu verwenden, oder eben auch nicht. Das kann man zentral an einer Stelle erledigen und muss da nicht von jedem möglichen Widget eine neue Klasse ableiten nur um das Fokusereignis zu überschreiben. Was dann ja auch zur Folge hat, dass man den Designer nicht mehr verwenden kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ich befürchte, dass hier gutemeinter Aktionismus völig am Ziel vorbei schießt.
Qt bringt ja die entsprechenden Zugangshilfen schon mit, _ohne_ dass man sich darum überhaupt kümmern muss. Bei Buttons fällt AccessibleName auf die Beschriftung zurücke, AccessibleDescription auf den Tooltext. Damit funktioniert es, ohne dass man sich mit dem Thema innig beschäftigen muss.
Für die Farbgebung gilt, was __blackjack__ schrieb. Auch hier funktioniert es, ohne dass man sich als Entwickler in der Anwendung großartig Gedanken darum machen muss.
Antworten