Seite 1 von 1

PyQt5 - QLabel richitg vererben

Verfasst: Dienstag 23. Mai 2017, 21:50
von PierreDole
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.

Re: PyQt5 - QLabel richitg vererben

Verfasst: Dienstag 23. Mai 2017, 21:59
von 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.

Re: PyQt5 - QLabel richitg vererben

Verfasst: Dienstag 23. Mai 2017, 22:57
von PierreDole
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

Re: PyQt5 - QLabel richitg vererben

Verfasst: Dienstag 23. Mai 2017, 23:13
von BigZ
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

Re: PyQt5 - QLabel richitg vererben

Verfasst: Donnerstag 25. Mai 2017, 18:52
von PierreDole
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...

Re: PyQt5 - QLabel richitg vererben

Verfasst: Donnerstag 25. Mai 2017, 20:02
von BlackJack
Vielleicht solltest Du für Qt5 nicht in der Qt4-Dokumentation nachschlagen: https://doc.qt.io/qt-5/qlabel.html

Re: PyQt5 - QLabel richitg vererben

Verfasst: Donnerstag 25. Mai 2017, 21:06
von PierreDole
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)

Re: PyQt5 - QLabel richitg vererben

Verfasst: Freitag 26. Mai 2017, 00:37
von BlackJack
@PierreDole: `parent` sollte an die Basisklasse weitergegeben werden. Macht ja sonst keinen Sinn da einen Wert zu übergeben, der dann ignoriert wird.

Re: PyQt5 - QLabel richitg vererben

Verfasst: Freitag 26. Mai 2017, 08:12
von __deets__
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.