QtDesigner output umwandeln und in script einbinden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
airtime
User
Beiträge: 23
Registriert: Donnerstag 23. August 2012, 12:52

Hi,

ich wollte eigentlich nur wissem ob der aufruf ok ist. Zudem ist reichlich code zuvor zusehen, aber ich will niemanden bitten sich den gesamten quellcode anzuschauen.
Irgendwie habe ich wohl meine Fragen falsch gestellt. Deswegen hier nochmal eine Zusammenfassung mit der Antwort.
Ich denke das könnte anderen Beginnern helfen.

Frage:
-Wie binde ich eine ui (mit QtDesigner erstellt) in ein script ein? Zudem ist in dem script schon ein MainWindow vorhanden.
Antwort:
-Erstelle in dem script eine Klasse die von QDialog erbt und die Klasse von der ui datei einbindet

Code: Alles auswählen

class MeinDialog(QtGui.QDialog): 
    def __init__(self): 
        QtGui.QDialog.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_Input_Selection()
        self.ui.setupUi(self)
-Der Aufruf im MainWindow kann mit Hilfe von einem icon in der Menübar visualisiert werden. Natürlich müsste man hier den Aufruf dem MainWindow Richtlinien anpassen (Button usw.)

Code: Alles auswählen

input = QtGui.QAction(QtGui.QIcon.fromTheme('list-add'), 'Input', self)
        input.setShortcut('Ctrl+I')
        input.setStatusTip('Set Input Files')
        self.connect(input, QtCore.SIGNAL('triggered()'), self.input)
-Der Aufruf wird mit Hilfe der funktion (hier input) durchgeführt. Da es sich um einen modalen Dialog handelt wird exec_ und nicht show genutzt.

Code: Alles auswählen

    def input(self):
        dia = MeinDialog()
        dia.exec_()
Für weitere Kritik und Tipps wäre ich sehr dankbar. Vorallem wenn etwas grundsätzlich falsch sein sollte.

Gruß Air
BlackJack

@airtime: So ganz grundsätzlich fehlt mir wo das `parent`-Objekt für den Dialog angegeben wird. Was vielleicht auch der Grund ist warum Du eine weitere Ereignisschleife starten musst, um das anzuzeigen.

Für das verbinden von Signalen und Slots gibt es einen besseren Weg:

Code: Alles auswählen

self.connect(input, QtCore.SIGNAL('triggered()'), self.input)
# =>
input.triggered.connect(self.input)
lunar

airtime hat geschrieben:

Code: Alles auswählen

    def input(self):
        dia = MeinDialog()
        dia.show()
Dieser Quelltext funktioniert nicht, da "MeinDialog()" kein "parent" hat. Dann kommen sich Python und Qt bei der Speicherverwaltung in die Quere, so dass der Dialog von Python gelöscht wird, bevor Qt die Chance hat, ihn anzuzeigen. Folgendes funktioniert:

Code: Alles auswählen

[code=python]class MeinDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
        QtGui.QDialog.__init__(self, parent)
        # Set up the user interface from Designer.
        self.ui = Ui_Input_Selection()
        self.ui.setupUi(self)
class MainWindow(QtGui.QMainWIndow):
# …
def input(self):
dia = MeinDialog(self)
dia.show()[/code]
Beachte das "self" im Aufruf von "MeinDialog()", sowie den neuen Parameter "parent" für "MeinDialog.__init__()". Diese zwei Dinge sind in PyQt essentiell, damit die Speicherverwaltung funktioniert. Setze immer das "parent"-Argument bei der Erzeugung von Qt-Objekten.
Antworten