Klasse, Vererbung und Zugriff

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
blck
User
Beiträge: 11
Registriert: Sonntag 17. Juli 2011, 00:37

Hallo,
ich brauch mal eure Hilfe zum Verständnis!

Ich schreibe gerade ein Programm wo ich eine Klasse vom Typ QMainWindow erstelle. Die stellt ja das eigentliche Widget da.
Wenn ich innerhalb der Klasse auf fenster zugreife, also zB fenster.stackedWidget.setCurrentItem() aufrufe, klappt das wunderbar.

Code: Alles auswählen

class newsWindow(QMainWindow):
  def __init__(fenster):
    QMainWindow.__init__(fenster)
    fenster.run()
Innerhalb der Funktion fenster.run() wird nun aber ein Objekt update erstellt, dass vom Typ update_inhalt ist. Diese Klasse importiere ich und habe sie so

Code: Alles auswählen

class update_inhalt(QtCore.QThread, newsWindow)
definiert.

Wie kann ich aber nun in der neuen Klasse so etwas wie fenster.stackedWidget.setCurrentItem() aufrufen. Da ich das mit vererbe, sollte das doch eigentlich bekannt sein, oder nicht?

MfG Blck
BlackJack

@blck: Du solltest nicht von der Konvention abweichen das erste Argument von Methoden `self` zu nennen. Das ist sonst sehr verwirrend.

Ebenfalls Konvention ist es Klassenamen mit einem Grossbuchstaben zu beginnen und „MixedCase” zu verwenden. Also `NewsWindow` und `UpdateInhalt`. Wobei mischen von Deutsch und English in Programmen IMHO eher besch…eiden aussieht. Klassennamen sollten ausserdem Dinge und keine Tätigkeiten beschreiben, denn Klassen repräsentieren Dinge im weitesten Sinne. Tätigkeiten dagegen werden von Funktionen und Methoden implementiert.

Rein Technisch lässt sich Deine Frage mit: Über das `self`-Argument kommst Du an das Exemplar auf dem die Methode aufgerufen wurde. Aber die Vererbung ist hier falsch eingesetzt. Vererbung beschreibt eine „ist-ein(e)”-Beziehung und damit wäre `UpdateInhalt` sowohl ein `QThread` als auch ein `QMainWindow` was IMHO eine Verquickung von Dingen ist, die nicht zusammen gehören.
blck
User
Beiträge: 11
Registriert: Sonntag 17. Juli 2011, 00:37

Hallo,
ja ist ein Erstlingswerk, welches zuerst einmal FUNKTIONIEREN muss. Dass mit der Namensgebung ist sicherlich richtig, dennoch lege ich hierdrauf im Moment keinen Wert.

Wenn ich die Vererbung falsch eingesetzt habe - wie wende ich es richtig an? Wie kann ich in der Klasse updateInhalt auf das Objekt fenster zugreifen? (Ich muss in der Klasse etwas in das Fenster "ausgeben".

MfG Blck
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Du wendest hier Vererbung richtig an, indem du sie nicht benutzt. Komposition ist das Stichwort. So könntest du dem Thread-Objekt zum Beispiel eine Referenz auf das Fenster-Objekt geben.

Namensgebeung ist, auch am Anfang, sehr wichtig. An den Namen ist leicht zu erkennen, worum es sich bei einem Objekt handelt: Klasse, Instanz, Funktion, ... Und sich Gedanken über sinnvolle Namen machen ist durchaus ein wichtiger Teil bei der Programmierung. Spätestens hier muss man sich Gedanken machen, was genau etwas ist und was nicht.

Sebastian
Das Leben ist wie ein Tennisball.
lunar

@blck: Hinzu kommt noch, dass die Bereitschaft anderer, sich Deinen Quelltext anzusehen und Dir zu helfen, umso höher ist, je ordentlicher Dein Quelltext ist.
blck
User
Beiträge: 11
Registriert: Sonntag 17. Juli 2011, 00:37

DUCK

Ok hab verstanden, werde das in der Zukunft wohl berücksichtigen.

Nun aber nochmal zurück zum Projekt (Rechtschreibung ist noch nicht angepasst - update_inhalt immernoch eine Klasse). Ich erstelle jetzt im ersten Skript per

Code: Alles auswählen

    #Objekt der Klasse update_inhalt erstellen und fenster übergeben
    update = update_inhalt(fenster)
ein Objekt der Klasse update_inhalt und übergebe fenster.

In der zweiten Datei wird die Variable wie folgt entgegen genommen:

Code: Alles auswählen

class update_inhalt(QtCore.QThread):
  def __init__(self,fenster):
        QtCore.QThread.__init__(self)
        self.fenster = fenster

  def run(self):
  .
  .
  .
  global_newsseite = self.fenster.ui.source_list.currentItem().text()        
Allerdings kriege ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\cyrix\Documents\python\Test\NewsAgregator\update.py", line 17, in run
    global_newsseite = self.fenster.ui.source_list.currentItem().text()        
AttributeError: 'NoneType' object has no attribute 'text'
Schubst mich doch noch mal in die richtige Richtung (wie ihr es oben bei der Rechtschreibung mit vereinten Kräften auch schon getan habt :P )

MfG Blck
BlackJack

@blk: Überleg mal was `currentItem()` zurück gibt, wenn gar kein Element ausgewählt ist.
lunar

@blck: Im Übrigen darfst Du auch keinesfalls aus anderen Threads als demjenigen, indem "QApplication" erzeugt wurde, auf GUI-Elemente zugreifen.
Antworten