PySide6 - object has no attribute 'emit'

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Karsten Böhme
User
Beiträge: 86
Registriert: Sonntag 23. Dezember 2012, 07:54

Hallo miteinander,

ich habe einer Klasse ein Signal hinzugefügt (als Klassen-Variable), die IDE meldet : object has no attribute 'emit'
Beim Debuggen steigt die Anwendung ohne Fehlermeldung aus.

Hier der Code (auszugsweise)

Code: Alles auswählen

class ThemeSwitcherClass(object):

    theme_switched = Signal(bool)

    def __init__(self, app: QApplication, default_palette: QPalette, dark_theme: bool = False, klc: str = 'Orange'):
        self._default_palette = default_palette
        self._app = app
        self._dark_theme: bool = dark_theme
        self._light_color: str = klc
        # set theme and light_color
        self._set_gui()

    @property
    def dark_theme(self) -> bool:
        return self._dark_theme

    @dark_theme.setter
    def dark_theme(self, th: bool) -> None:
        self._dark_theme = th
        self._set_gui()
        self.theme_switched.emit(th)                 #  Fehlermeldung !
    @property
    def light_color(self) -> str:
        return self._light_color

    @light_color.setter
    def light_color(self, lc: str):
        self._light_color = lc
        self._set_gui()

    def _set_gui(self):
        rgb_lc: QColor = light_colors[self._light_color]
        if self._dark_theme is False:
            self._app.setStyle(QStyleFactory.create("Fusion"))
            self._app.setPalette(self._default_palette)            # set default palette
            self._app.setPalette(LightPalette(rgb_lc))             # modify default palette
            self._app.setStyleSheet(STYLESHEET_CLASSIC % (rgb_lc.name(), rgb_lc.name()))
        else:
            self._app.setStyle(QStyleFactory.create("Fusion"))
            self._app.setPalette(self._default_palette)            # set default palette
            self._app.setPalette(DarkPalette(rgb_lc))              # modify default palette
            self._app.setStyleSheet(STYLESHEET_DARK % (rgb_lc.name(), rgb_lc.name()))
Ich erkenne hier keinen Fehler. Habe eine identische Implementation in einer anderen Klasse, dort funktioniert der Code einwandfrei.
Seht ihr einen Fehler ?

Grüße
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst fuer Qt von QObject erben. Nicht von object.
Karsten Böhme
User
Beiträge: 86
Registriert: Sonntag 23. Dezember 2012, 07:54

Ich danke Dir ! Jetzt funktioniert es, wobei mir der Grund noch nicht ganz klar ist.

Viele Grüße
Karsten
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

emit ist nunmal eine Qt-Funktionalitaet, und die funktioniert nur mit QObjects, also mit Qt-Objekten. Woher sonst soll das kommen?

Nachtrag: du musst den Konstrukter der Basisklasse aufrufen, nicht vergessen! Das kann sonst zu subtilen Fehlern fuehren.
Karsten Böhme
User
Beiträge: 86
Registriert: Sonntag 23. Dezember 2012, 07:54

Danke, den Konstruktor hatte ich gleich mit eingefügt. Bei dem anderen Signal war die Klasse unter anderem von QWidget abgeleitet. Deshalb hat es auch funktioniert.
Antworten