PyQt5 - QLabel richitg vererben

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Moin,
ich komme an einer Stelle nicht weiter. Ich versuche den Konstruktor von QLabel zu überschreiben und bin schon so weit gekommen, daß er die Parameter alle akzeptiert. Das Problem ist, er sagt jetzt, daß der Konstruktor der Parent-Klasse nicht aufgerufen wird. Zudem sagt er auch "self" ist nicht definiert. Bin leicht überfordert. Weiß jemand einen Lösungsansatz? Der Konstruktor wird hier http://doc.qt.io/qt-5/qlabel.html nochmal genauer beschrieben.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import sys
import PyQt5.QtCore as Core
import PyQt5.QtWidgets as Widgets
import PyQt5.QtGui as Gui
import PyQt5.uic as uic

import sqlite3


class Headline(Widgets.QLabel):
    def __init__(text, parent = None, x = 0, y = 0):
        super().__init__(text, parent = None, x = 0, y = 0) 
        
        font = Gui.QFont()
        font.setFamily("Verdana")
        font.setPixelSize(14)
        font.setBold(True)
        self.setFont(font)

Die Fehlermeldung:
File "F:/workspace/python/mienPlatt/mienPlatt.py", line 14, in __init__
super().__init__(text, parent = None, x = 0, y = 0) # Konstruktor der Parent-Klasse

RuntimeError: super-class __init__() of type Headline was never called

An exception has occurred, use %tb to see the full traceback.
BlackJack

@PierreDole: Da fehlt ja mindestens mal `self` als Argument. Das fällt ja nicht vom Himmel. Also beim Aufruf dann schon fast, aber es ist halt ein normales Argument und muss deshalb auch in der Signatur aufgeführt werden.
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Das hatte ich schon versucht, da ich es in einigen Beispielen gesehen habe. Nur, wenn ich es so mache, kommt der Fehler:
TypeError: arguments did not match any overloaded call:
QLabel(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 2 has unexpected type 'str'
QLabel(str, parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'Headline'
Heißt, laut Beschreibung kann ich es entweder so

Code: Alles auswählen

def __init__(parent = None, x = 0, y = 0):
oder so

Code: Alles auswählen

def __init__(text, parent = None, x = 0, y = 0):
machen.

In beiden Fällen wird aber weder super() aufgerufen noch kennt er self. :K
Benutzeravatar
BigZ
User
Beiträge: 30
Registriert: Mittwoch 1. Juli 2015, 21:18
Wohnort: Hamburg
Kontaktdaten:

Benutzt du Python 2+, oder 3+?
In Python 2+ musst du super mit der Klasse selbst aufrufen
[codebox=pycon file=Unbenannt.txt]
class Test(IrgendeineVererbendeKlasse):
def __init__(self, *args, **kwargs):
super(Test, self).__init__(*args, **kwargs)
[/code]
Hier steht noch ein bisschen was drüber
"Ist noch λ?"
"Ja, aber das ϕ ist noch ϱ"
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Ich benutze Python 3.6. Ich hab da wieder paar Stunden reingesteckt. Kriege das einfach nicht hin.

Edit:
Ich bekomme den Fehler hier:
File "F:/workspace/python/mienPlatt/mienPlatt.py", line 15, in __init__
super().__init__(text, parent = None, flags = 0)

TypeError: arguments did not match any overloaded call:
QLabel(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'str'
QLabel(str, parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 'flags' has unexpected type 'int'
und so sieht es momentan aus:

Code: Alles auswählen

class Headline(Widgets.QLabel):
    def __init__(self, text, parent = None, flags = 0):
        super().__init__(text, parent = None, flags = 0)
Ich verstehe das nicht. Hier http://doc.qt.io/qt-4.8/qlabel.html stehen unter Public Functions die beiden Konstruktoren und flags ist da jeweils = 0...
BlackJack

Vielleicht solltest Du für Qt5 nicht in der Qt4-Dokumentation nachschlagen: https://doc.qt.io/qt-5/qlabel.html
PierreDole
User
Beiträge: 17
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

Oh Mann, war das eine schwere Geburt. Vielen Dank euch! Ich habe die flags einfach weglassen können. Habe mich davor noch elend lang mit Qt.WindowFlags() abgequält, da mir Spyder meldete, daß es das gar nicht gibt.

Die Klasse sieht jetzt so aus und sie funktioniert wunderbar.

Code: Alles auswählen

class Headline(Widgets.QLabel):
    def __init__(self, text, parent = None):
        super().__init__(text, parent = None)
        
        font = Gui.QFont()
        font.setFamily("Verdana")
        font.setPixelSize(14)
        font.setBold(True)
        self.setFont(font)
BlackJack

@PierreDole: `parent` sollte an die Basisklasse weitergegeben werden. Macht ja sonst keinen Sinn da einen Wert zu übergeben, der dann ignoriert wird.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und nachdem du jetzt etwas gelernt hast, solltest du den Code wegschmeißen & stattdessen qt style sheets verwenden. Das erlaubt dir den Designer zu verwenden & ist generell deutlich flexibler.
Antworten