Aufruf von 2. Designer Formular

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Hallo zusammen,

ich versuche im Moment mich ein wenig an PyQT4 ranzutasten und hab mal zu Testzwecken 2 Formulare via Designer erstellt und mit pyuic4 entsprechend in Python Code umgewandelt. Soweit so gut.

Aus dem Startprogramm öffne ich nun das MainWindow was auch klappt und der von vornherein als Signal angelegte close Button ebenso.

Jetzt möchte einfach nur über den open Button das 2 Formular anzeigen lassen, nichts weiter. Ich habe jetzt glaube so ziemlich alles probiert, aber irgendwie komme ich nicht sinnvoll weiter.

Was muss da rein damit das läuft? Glaube ich sehe den Wald vor lauter Bäumen nicht mehr.

Ich bin mir bewusst dass das ganze keine sinnige Funktion besitzt, aber zum rantasten reicht es um gewisse Funktionalitäten zu erlernen.

Danke für eure Hilfe im Vorraus,

Christian

startprogramm:

Code: Alles auswählen

#!/usr/bin/python2.5
import sys
from PyQt4 import QtCore, QtGui
from MainWindow import Ui_MainWindow
from form import Ui_Form

class StartQT4(QtGui.QMainWindow):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.buttonopen,QtCore.SIGNAL("clicked()"),self.open_form)
    def open_form(self):
        #Oeffnen von 2. form
        self.uiform = Ui_Form()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())
MainWindow:

Code: Alles auswählen

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

# Form implementation generated from reading ui file 'MainWindow.ui'
#
# Created: Tue Jun  9 17:33:30 2009
#      by: PyQt4 UI code generator 4.5
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(323, 117)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.buttonclose = QtGui.QPushButton(self.centralwidget)
        self.buttonclose.setGeometry(QtCore.QRect(180, 30, 99, 25))
        self.buttonclose.setObjectName("buttonclose")
        self.buttonopen = QtGui.QPushButton(self.centralwidget)
        self.buttonopen.setGeometry(QtCore.QRect(30, 30, 99, 25))
        self.buttonopen.setObjectName("buttonopen")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.buttonclose, QtCore.SIGNAL("clicked()"), MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.buttonclose.setText(QtGui.QApplication.translate("MainWindow", "Close", None, QtGui.QApplication.UnicodeUTF8))
        self.buttonopen.setText(QtGui.QApplication.translate("MainWindow", "open", None, QtGui.QApplication.UnicodeUTF8))

2. Formular

Code: Alles auswählen

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

# Form implementation generated from reading ui file 'form.ui'
#
# Created: Tue Jun  9 18:16:13 2009
#      by: PyQt4 UI code generator 4.5
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(247, 144)
        self.buttonclose = QtGui.QPushButton(Form)
        self.buttonclose.setGeometry(QtCore.QRect(70, 50, 99, 25))
        self.buttonclose.setObjectName("buttonclose")

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.buttonclose, QtCore.SIGNAL("clicked()"), Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.buttonclose.setText(QtGui.QApplication.translate("Form", "Close", None, QtGui.QApplication.UnicodeUTF8))

Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

hi,

der designer ist für den einstieg ungeeignet.
du solltest am anfang den code per hand schreiben und verstehen was du tust.
http://www.kinderpornos.info
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Was jetzt nicht wirklich meine Frage beantwortet, dass du vielleicht Recht haben magst gebe ich zu, allerdings ist QT Wissen vorhanden und im Moment lote ich einfach aus ob es nicht Sinn macht meine Applikation auf python zu portieren.

Das ganze entsteht eigentlich mehr aus Spieltrieb, wo liegt das Problem vielleicht trotzdem die Frage zu beantworten, eine Lösung dafür wird es ja geben. Alleridngs muss ich ehrlich zugeben dass ich im netz und hier nciht wirklich fündig geworden bin

Gruss,
Christian
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

ich bin selbst qt-anfänger, ich müsste mir das also genauer anschauen, das kann ich später auch mal machen.

so einen schlauen spruch hinzuschreiben geht halt einfacher als sich wirklich mit dem problem auseinanderzusetzen. :wink:

edit:
ich hab mir das jetzt mal angesehen.
StartQt4.open_form() wird aufgerufen bei dem click auf den open button (warum verknüpfst du die signale für close und open an unterschiedlichen stellen?)
Aber da tut sich ja nix, ausser dass du eine Ui_form(object) erstellst. das ist ein simples py-objekt, kein qt-objekt. das wird es erst in setupUi dem eine Form-instanz übergeben werden soll. du rufst diese methode aber nie auf. und was soll Form sein? ein QDialog?
http://www.kinderpornos.info
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Irgendeine Lösung zu haben wäre toll, weil eigentlich muss es doch gehen auch ein weiteres Formular einzubinden, mit dem hauptfenster passt es ja auch auf diesem Weg.

Oder bin ich auf dem Holzweg?
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

ich habe doch geschrieben warum es nicht funktioniert. ist dir noch nicht klar warum da nichts passiert? du musst in open_form() setupUi() mit geeignetem parameter aufrufen. das wäre schonmal ein schritt in die richtige richtung.
http://www.kinderpornos.info
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Neben dem falschen Aufruf sehen die generierten Datein komisch aus, denn eigentlich müssten sich die Objekte von Qt-Klassen ableiten, kann es sein, dass du da im Designer geschludert hast?

Außerdem benutzt man in Python eher den Weg die "ui"-Dateien dynamisch einzubinden (siehe http://www.riverbankcomputing.co.uk/sta ... uic-module)
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Die ui Dateien dynamisch einzubinden hatte ich als zweiten Schritt angedacht, da sich in meinen Testdateien ja ohnehin nicht wirklich etwas ändert. Aber ich teste das gleich mal.

Welchen falschen Aufruf meinst du denn?

Inwiefern lässt sich im Designer schludern? Ich habe ein neues Formular erstellt und den Button eingebaut, lediglich den close Button anschliessend direkt mit einem Signal belegt.
cofi hat geschrieben:Neben dem falschen Aufruf sehen die generierten Datein komisch aus, denn eigentlich müssten sich die Objekte von Qt-Klassen ableiten, kann es sein, dass du da im Designer geschludert hast?

Außerdem benutzt man in Python eher den Weg die "ui"-Dateien dynamisch einzubinden (siehe http://www.riverbankcomputing.co.uk/sta ... uic-module)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

BBlack hat geschrieben:Welchen falschen Aufruf meinst du denn?
Denselben wie Dill, Zeile 14-16: Du erzeugst ein Python-Objekt. Aber nicht ein Qt-Objekt. Schon gar kein initialisiertes, denn die PyQt-generierten stellen da eben keine ``__init__`` Methode sondern eine ``setupUi`` Methode bereit mit denen man entsprechende Qt-Klassen einrichtet.
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Ja und genau da ist ja mein Problem, an der stelle möchte ich mein 2. Formular laden, das was dort steht ist lediglich ein Überbleibsel meiner Versuche und dass es falsch ist war klar, deswegen habe ich die Frage gestellt was der richtige Weg ist auf dem es funktioniert.

Um das MainWindow zu konstruieren habe ich ja auch auf setupUi zugegriffen, soweit klar, aber wie mache ich das jetzt mit dem 2. Fenster? Was ist die richtige Notation dafür? Wie fuioniert ist. Genau da komme ich ja nicht weiter.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du erstellst ein Objekt desselben Typs und wendest dann die `setupUi`Methode der generierten Klasse darauf an, wie du es auch beim MainWindow gemacht hast.

Aber vielleicht solltest du mal http://www.riverbankcomputing.co.uk/sta ... t4ref.html komplett lesen.
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

Hi!

Ok, wenn ich das richtig verstehe müsste es folgendermassen aussehen ( ich poste mal nur die angepasst Stelle

Code: Alles auswählen

    def open_form(self):
        #Oeffnen von 2. form
        window = QtGui.QWidget()
        uiform = Ui_Form()
        uiform.setupUi(window)
        window.show()
Er meckert mal nichts an, allerdings passiert auch nichts. Ich habe zwar den Eindruck dass das Fenster ganz kurz erscheint, dann aber wieder weg ist, ohne dass der Close Button gedrückt wurde, was ja eigentlich nichts so sein soll.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

warum übergibst du dem Form ein qwidget?
du hast seltsamerweise auch in startqt4 qwidget__init__ aufgerufen obwohl das ein qmainwindow ist. also mir ist der code den der designer ausspuckt zu hoch. und ich weiss auch nicht was das bringen soll den zum laufen zu bekommen. schau dir doch lieber mal die beispiele die pyqt mitbringt an und lies ein tutorial und die pyqt-reference...
http://www.kinderpornos.info
BBlack
User
Beiträge: 7
Registriert: Dienstag 9. Juni 2009, 16:30

@Dill
Sorry, aber ehrlich gesagt nur weil es dir zu hoch ist bedeutet ja nicht dass es nicht funktioniert oder? Sorry, aber wirklich konstruktiv hast du zu meinem Thread nicht beigetragen....

@cofi
Danke für den Denkanstoss, ich habe es mittlerweile dann auch hingekriegt und kann mal weiterspielen was die Funktionalitäten angeht. Danke dir.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

:shock: so dummdreist muss man erstmal sein.
http://www.kinderpornos.info
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Dill: Jetzt hab ich vor lauter Verwirrung auf Dein Attachment geklickt, die sind gleich da... :shock:

@BBlack: Auch wenn jmd. freimütig zugibt, daß ihm etwas zu hoch ist, wirds, als Argument gegen ihn gebracht, schnell zu einer Beleidigung ;)
Antworten