weiteres Fenster öffnen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ninil
User
Beiträge: 2
Registriert: Mittwoch 4. Mai 2016, 10:48

Hallo zusammen!

Leider wusste ich nicht genau nach was ich suchen sollte und alle suchen führten zu nichts.
Deshalb bitte entschuldigt wenn das Thema bereits behandelt wurde.

Folgendes Problem:
Ich bin neu in der Programmierung mit Python und QT
Einfach Programme ohne Benutzeroberfläche klappen ganz gut aber jetzt wollte ich mich auch mal daran versuchen.
Nun habe ich ein Programm welches mir ein Hauptfenster anzeigt, aus diesem Hauptfenster soll ein weiteres Fenster (settingswindow) geöffnet werden.
Das passiert auch allerdings wird es gleich wieder geschlossen und bleibt nicht offen.
Ich vermute es liegt daran das ich es in einer Funktion aufrufe und diese das Fenster nach ende der Funktion wieder schließt, korrekt ?
Nun weiß ich allerdings nicht was ich machen kann um dieses Fenster offen zu halten....

Code: Alles auswählen

import sys,requests,time,datetime
from PyQt5 import QtCore, QtGui, QtWidgets
import loading_screen,mainWindow,settingsWindowui


def QUIT(s):
   sys.exit()

def settings_window():
   settingsWindow=QtWidgets.QMainWindow()
   sui= settingsWindowui.Ui_SettingsWindow()
   sui.setupUi(settingsWindow)
   settingsWindow.show()

#Main Window(Initial)

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = mainWindow.Ui_MainWindow()
ui.setupUi(MainWindow)

#Buttons

ui.shutdown.clicked.connect(QUIT)
ui.settings.clicked.connect(settings_window)

MainWindow.show()

sys.exit(app.exec_())
BlackJack

@Ninil: Da fallen gleich mehrere Sachen auf: Auf Modulebene sollten nur Konstanten, Funktionen, und Klassen definiert werden. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Beim schliessen gleich hart `sys.exit()` aufzurufen ist keine gute Idee und auch nicht der vorgesehene Weg eine Qt-Anwendung zu beenden. Damit umgeht man potentiell sämtliche Aufräumarbeiten die die Qt-Anwendung am Ende vielleicht noch tätigen möchte, wie Zustände speichern die Programmstarts überdauern sollen, oder auch den Benutzer fragen ob tatsächlich beendet werden soll wenn noch ungespeicherte Dokumente offen geöffnet sind. `QCoreApplication.quit()` ist der normale Weg eine Anwendung zu beenden. Und normalerweise wird die auch automatisch aufgerufen wenn keine Fenster mehr geöffnet sind. Also braucht man das eigentlich nur bei Anwendungen die tatsächlich mehrere, gleichberechtigte Fenster auf oberster Ebene geöffnet haben können.

Womit wir zu den Fenstern und ihren Abhängigkeiten kommen. Ein Einstellungsfenster ist selten ein *Hauptfenster*. Das scheint mir der falsche Datentyp dafür zu sein. Üblicher wäre `QDialog`. Ein Einstellungsfenster ist üblicherweise auch nicht gleichberechtigt mit dem Hauptfenster, sondern Abhängig davon. Also sollte man das Hauptfenster als Elternobjekt angeben. Was deutlich einfacher geht wenn das keine Funktion, sondern eine Methode wäre auf einem Objekt über das man dann auch Zugriff auf das Hauptfenster hat. Damit dürfte sich auch schon das mit dem schliessen erledigt haben, denn dann existiert eine Referenz auf das Einstellungsfenster solange das Hauptfenster existiert. Und wenn man das Einstellungsfenster offen ist und man das Hauptfenster schliesst, dann schliesst sich auch das abhängige Einstellungsfenster und in der Defaulteinstellung beendet sich damit auch gleich die Qt-Anwendung. Es würde also völlig reichen wenn `ui.schliessen` mit den schliessen des Hauptfensters verbunden wird.

Last but not least könnte man sich auch überlegen den Einstellungsdialog modal zu machen, also `exec_()` statt `show()` auf dem Dialog aufzurufen. Näheres steht in der Dokumentation zu `QDialog`.

Es sieht so aus als hättest Du aus `*.ui`-Dateien vom Designer Quelltext generiert und importierst den hier‽ Das macht man eigentlich nicht mehr, weil man sich den Zwischenschritt sparen kann und mit dem `PyQt5.uic`-Modul die `*.ui`-Dateien zur Laufzeit laden kann.
Ninil
User
Beiträge: 2
Registriert: Mittwoch 4. Mai 2016, 10:48

Danke für deine ausführliche Antwort :-)
Ich werde mal deine Anmerkung durcharbeiten und melde mich falls es noch etwas gibt.
Antworten