noch ein Problem mit QDialog und QPushButton

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

Ich habe schon wieder so ein "Brett vor dem Kopf" Problem. Ich habe mein QMainWindow und über eine ToolBar-Action rufe ich die Methode neuerEintrag auf:

Code: Alles auswählen

def neuerEintrag(self):
        aktuell = self.parent().parent().tabText(self.parent().currentIndex())
        if aktuell == u"Widerstände":
            eingabe = UIWiderstand()
            dialog = QtGui.QDialog(self)
            dialog.setLayout(eingabe.hbox)
            dialog.setModal(True)
            dialog.show()
        else:
            print aktuell
UIWiderstand ist ein QWidget mit u.a. 2 PushButton:

Code: Alles auswählen

        self.buttonAccept = QtGui.QPushButton(u"Übernehmen")
        self.buttonAccept.clicked.connect(self.speichern)
        grid.addWidget(self.buttonAccept, 5, 0)
        
        buttonReject = QtGui.QPushButton("Abbrechen")
        buttonReject.clicked.connect(self.close)
        grid.addWidget(buttonReject, 5, 1)
        buttonReject.click()
Leider wird nichts von den Button ausgeführt. Also weder die Methode self.speichern noch self.close wird aufgerufen. Egal ob ich klicke oder per buttonReject.click() den Klick ausführe...
Ich bekomme leider keinerlei fehler egal welche debug/warn Meldungen ich mir von python anzeigen lasse...

Irgendwelche Ideen?
Zuletzt geändert von huehnerhose am Donnerstag 9. September 2010, 13:51, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso nutzt Du nicht einfach den Designer und dessen "Standard"-Dialog-Vorgabe. Dort sind über die ButtonBox bereits die Standardbuttons vordefiniert und einfach abfragbar. Zudem könntest Du Dir das manuelle Layout-Gedöns sparen.

Zum Problem: Du solltest Dich noch einmal mit den Grundlagen von Klassen- und Instanzattributen befassen. Das sieht alles sehr wirr aus bei Dir - und könnte Dir selber auffallen ;-) Zur Not kannst Du Dir ja auch mal eine vom Designer erstellte Python-Datei angucken; da wird alles korrekt gesetzt.

Als letztes: Es gibt ein spezielles Code-Tag für Python Code ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
huehnerhose
User
Beiträge: 6
Registriert: Montag 6. September 2010, 18:36

Erstmal danke für die Antwort.
Das mit dem Designer war mein erster Weg als ich versuchte mich Qt zu nähren, nur irgendwie habe ich kein, für mich, verständliches Tutorial gefunden, dass das mit dem Designer macht und die Tutorials zum händischen designen mit der Ausgabe von pyuic4 zusammenzubringen habe ich nicht so recht hinbekommen.
Mit der Variante das manuell zu machen bin ich bis jetzt recht glücklich, kommt Flex recht nahe :)

Das der Schnipsel recht wirr aussieht stimmt, sehe ich auch, ist aber auch dem Fakt geschuldet das erste Widget zu sein, dass ich gebastelt hatte und jetzt nur wieder anfassen musste um die Button hinzuzufügen. Ich bin auch schon auf die Idee gekommen dass es ja für Dialoge Widgets mit Button gibt, aber das ändert ja eigentlich nichts daran, dass es auch so funktionieren sollte - was das auch z.B. im Hauptfenster so tut. Daher überhaupt mein Drang nachzuforschen warum es in der Kombination nicht mehr funktioniert.

Python-Tag ist geändert :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

huehnerhose hat geschrieben: Das mit dem Designer war mein erster Weg als ich versuchte mich Qt zu nähren, nur irgendwie habe ich kein, für mich, verständliches Tutorial gefunden, dass das mit dem Designer macht und die Tutorials zum händischen designen mit der Ausgabe von pyuic4 zusammenzubringen habe ich nicht so recht hinbekommen.
Hm... naja, prinzipiell ist das manuelle Anlegen von Widgets stupide imho. Außerdem gibt doch ein brauchbares Tutorial bei der Qt-Doku. Zudem kann man die UI-Daten dann ja dynamisch per uic-Modul laden. Dazu gibts u.a. auch hier im Forum genügend Snippets.

Nuja, manchmal fasst man alten Code an und stellt fest, dass das so schrottig ist, das es sinnvoll ist, das ganze komplett neu zu schreiben ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@huehnerhose: Was ich an dem Quelltext am erschreckendsten finde, ist die Verwendung von `parent()`. Die GUI-Logik sollte nicht auf diese Weise mit der Widgethierarchie verzahnt sein. Dann kann man am Ende nichts mehr an der Präsentation der GUI ändern, ohne das alles zusammenbricht. Wenn man nicht einmal irgendwo in der Hierarchie ein Containerwidget einfügen könnte um zum Beispiel einen Rahmen mit einer Beschriftung um andere Widgets zu legen, ohne dass die GUI-Logik angepasst werden muss, weil dann ein `parent()` mehr irgendwo stehen müsste, dann macht man etwas falsch. Wenn man aus "Eltern" irgendwo "Geschwister" macht, wird es noch umständlicher den Quelltext anzupassen.

"Kindwidgets" sollten keine Annahmen und direkten Zugriffe auf "Elternwidgets" über die Hierarchie machen. Wenn man Zugriff auf andere Widgets braucht, sollte man diese separat bekannt machen, so dass sie sich immer noch kennen, wenn man an der Hierarchie schraubt.
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@huehnerhose
hierhttp://www.cs.usfca.edu/~afedosov/qttut
wo genau erklärt wird, wie die Zusammenhänge von pyuic und pyqt4 sind. Das ist zwar 1 älteres beispiel aber immer noch sehr aktuell.
Das Beispiel solltest Du genau durcharbeiten und mehrfach nachvollziehen. Der Russe hat es tatsächlich gut dargestellt und erklärt.
Da reicht auch schulenglisch dafür.
Nokia bringt sowas nicht, die haben erstmal 1 neuen VV (CEO in english).
Es kann nur besser werden.
Arbeite das Beispiel durch, es hat mir viel geholfen.
Fragen kannst Du hier stellen
Guude!
Fritz

8) 8)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

3ff hat geschrieben:@huehnerhose
hierhttp://www.cs.usfca.edu/~afedosov/qttut
wo genau erklärt wird, wie die Zusammenhänge von pyuic und pyqt4 sind. Das ist zwar 1 älteres beispiel aber immer noch sehr aktuell.
Nein, es ist eben nicht aktuell! Und wieso willst Du ihm wieder beibringen, ui-Files per Hand in Code umzuwandeln, anstatt sie sich bequem dynamisch aus den .ui-Files zu laden? Das uic-Modul ist nun wirklich einfach zu handhaben - Beispiele gibts alleine hier im Forum genug.

Hör doch mal auf, immer wieder den selben alten Kram zu empfehlen! Du wurdest da ja schon einmal drauf hingewiesen (Link)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten