QT Mehrere Fenster

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Schönen guen Tag Liebes Forum,

Ich benötige erneut eure hilfe ich sitze nun seit Tage an einem eigentlich sehr leichten Problem fest und bekomme es einfach nicht gelöst Ich habe das Internet rauf und runter durchsucht ( beziehungsweise mich nun auch mehrere Stunden mit der QT Dokumentation beschäftigt nur leider bin ich einfach zu blöd oder verstehe manchmal nicht richtig was die von mir möchten.

Also zu meinem eigentlichen Problem ich Möchte Quasi eine Mainwindow erstellen wo ich in der Toolbar mehrere quasi Menüpunkte habe die wenn ich sie ankliche in form von Widgets bzw Dialogen sich öffnen .... ICh hab das alles auch soweit hinbekommen:

Code: Alles auswählen

 import sys

from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QIcon, QGuiApplication, QStandardItemModel, QColor, QPalette
from PyQt5.QtWidgets import QAction, QPushButton, QVBoxLayout, QDialog, QApplication, QMainWindow, QTableWidget, \
    QHeaderView
from PyQt5.QtCore import pyqtSignal,pyqtSlot

class Hauptbildschirm(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        # Ist nur für die erprobung als kommentar
        # Startbildschirm.showFullScreen()
        # Hier sind verschiedene Auflösungen schnell auswählbar
        # Startbildschirm.resize(720,576)
        # Startbildschirm.resize(1280,720)
        self.resize(1920, 1080)
        # Startbildschirm.resize(2560 ,1440)
        self.setWindowTitle("MAT")
        self.setWindowIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\system.png"))


#Ab hier wird das Menü angelegt:

        self.menubar = QtWidgets.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1920, 30))

#Statusbar wird nicht benutzt kann aber so leichter eingebunden werden:
        #self.statusbar = QtWidgets.QStatusBar(self.centralwidget)
        #self.statusbar.setobjektname = ("statusbar")
        #Startbildschirm.setStatusBar(self.statusbar)


        #hier wurde die Frotschrittanzeige ( wie weit die Messung mit dem durchlauf ist anglegt)
        self.progressbar = QtWidgets.QProgressBar(self)
        self.progressbar.setGeometry(10,750,1550,30)
        self.progressbar.setValue(100)
        self.progressbar.setRange(0,100)


        #Startknopf
        self.Start = QtWidgets.QPushButton(self)
        self.Start.setGeometry(QtCore.QRect(10, 700, 111, 30))
        #Stopknopf
        self.Stop = QtWidgets.QPushButton(self)
        self.Stop.setGeometry(QtCore.QRect(1415, 700, 111, 30))

        #Beschriftung über der Fortschrittanzeige
        self.Fortschrittsanzeige = QtWidgets.QLabel()
        self.Fortschrittsanzeige.setGeometry(QtCore.QRect(12, 725, 111, 30))





#das Menü ist soweit vorbereitet,ab hier werden die Menüpunkte erzeugt:

        #1ter Menüpunkt:
        self.Cockpit = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Cockpit.menuAction())

        #2ter Menüpunkt:
        self.Formulareinstellungen = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Formulareinstellungen.menuAction())
        #3ter Menüpunkt:
        self.Messdatenparamter = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Messdatenparamter.menuAction())
        #4ter Menüpunkt:
        self.Messdaten = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Messdaten.menuAction())
        #5ter Menüpunkt:
        self.Datenexportieren = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Datenexportieren.menuAction())
        #6ter Menüpunkt:
        self.Einstellungen = QtWidgets.QMenu(self.menubar)
        self.menubar.addAction(self.Einstellungen.menuAction())
        self.setMenuBar(self.menubar)

#Die Menüpunkte wurde hier erzeugt nun werden die Unterpunkte erzeugt:
        #Unterpunkt zu Menü 1
        self.Exit = QtWidgets.QAction()
        self.Exit.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\door-open-out"))
        self.Exit.triggered.connect(self.close)
        self.Cockpit.addAction(self.Exit)


        #Unterpunkte zu Menü 2:
        self.Formulare = QtWidgets.QAction()
        self.Formulare.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\gear"))
        self.Formulare.triggered.connect(Fomrulardialog)
        self.Formulareinstellungen.addAction(self.Formulare)


        self.Graphen = QtWidgets.QAction()
        self.Graphen.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\gear"))
        self.Formulareinstellungen.addAction(self.Graphen)

        #Unterpunkt zu Menü 3:
        self.Stammdaten=QtWidgets.QAction()
        # self.Stammdaten.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\png"))
        self.Messdatenparamter.addAction(self.Stammdaten)

        #Unterpunkte zu Menü 4:
        self.Fertigdaten = QtWidgets.QAction()
        #self.Fertigdaten.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\png"))
        self.Messdaten.addAction(self.Fertigdaten)

        self.Rohdaten = QtWidgets.QAction()
        #self.Rohdaten.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\png"))
        self.Messdaten.addAction(self.Rohdaten)

        #Unterpunkte zu Menü 5:
        self.Access = QtWidgets.QAction()
        self.Access.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\document-access"))
        self.Datenexportieren.addAction(self.Access)

        self.FTP = QtWidgets.QAction()
        self.FTP.setObjectName("FTP")
        self.FTP.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\upload-cloud"))
        self.Datenexportieren.addAction(self.FTP)

        self.TXT = QtWidgets.QAction()
        self.TXT.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\document"))
        self.Datenexportieren.addAction(self.TXT)

        self.Festplatte = QtWidgets.QAction()
        self.Festplatte.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\drive-medium"))
        self.Datenexportieren.addAction(self.Festplatte)

        self.USB = QtWidgets.QAction()
        self.USB.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\usb-flash-drive"))
        self.Datenexportieren.addAction(self.USB)

        self.Excel = QtWidgets.QAction()
        self.Excel.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\document-excel"))
        self.Datenexportieren.addAction(self.Excel)

        self.Email = QtWidgets.QAction()
        self.Email.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\mail"))
        self.Datenexportieren.addAction(self.Email)
        #Unterpunkte zu Menü 6
        self.Datenübertragung = QtWidgets.QAction()
        self.Datenübertragung.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\transmitter"))
        self.Einstellungen.addAction(self.Datenübertragung)

        self.USV = QtWidgets.QAction()
        self.USV.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\battery"))
        self.Einstellungen.addAction(self.USV)

        self.Interpolieren = QtWidgets.QAction()
        self.Interpolieren.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\flask"))
        self.Einstellungen.addAction(self.Interpolieren)

        self.AI =QtWidgets.QAction()
        self.AI.setIcon(QIcon(r"C:\Users\Marcel\Desktop\MAT\Mat_Pycharm\Icons\robot"))
        self.Einstellungen.addAction(self.AI)


#hier werden die Titel für die Menpunkte zugeordnet / festgelegt:
        self.beschriftung()
    def beschriftung(self):
        self.beschriftung = QtWidgets.QApplication
        self.Start.setText("Start")
        self.Stop.setText("Stop")
        self.Fortschrittsanzeige.setText("Fortschrittsanzeige:")
        self.Cockpit.setTitle("Cockpit")
        self.Formulareinstellungen.setTitle("Formular und Grapheneinstellungen")
        self.Messdatenparamter.setTitle("Messdatenparameter")
        self.Messdaten.setTitle("Messdaten")
        self.Datenexportieren.setTitle("Daten exportieren")
        self.Einstellungen.setTitle("Einstellungen")
        self.Exit.setText("Exit")
        self.Formulare.setText("Formulare")
        self.Graphen.setText("Graphen")
        self.Stammdaten.setText("Stammdaten")
        self.Fertigdaten.setText("Fertigdaten")
        self.Rohdaten.setText("Rohdaten")
        self.Access.setText("Access")
        self.FTP.setText("FTP")
        self.TXT.setText("TXT")
        self.Festplatte.setText("Festplatte")
        self.USB.setText("USB")
        self.Excel.setText("Excel")
        self.Email.setText("Email")
        self.Datenübertragung.setText("Datenübertragung")
        self.USV.setText("USV")
        self.Interpolieren.setText("Interpolieren")
        self.AI.setText("Künstliche Intelligenz")

#Hier erzeugen wir einen neuen Dialog( Fenster)



class Fomrulardialog(QtWidgets.QDialog):
      def __init__(self,Hauptbildschirm):
          QtWidgets.QDialog.__init__(self)
          self.show()
          self.setWindowTitle("Formular-Einstellungen")
          self.resize(1200,720)
          self.table=QTableWidget()
          self.table.setGeometry(QtCore.QRect(10, 200, 400, 200))
          self.table.setColumnCount(4)
          self.table.setHorizontalHeaderLabels(["Kanal","Text","Beschreibung","*"])
          self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)



if __name__ == '__main__':
    app= QApplication(sys.argv)
    Ha=Hauptbildschirm()
    Fa = Fomrulardialog(Hauptbildschirm)
    Ha.show()
    sys.exit(app.exec_())

Hier sollte nun der Code eingeblendet sein ICh habe wie bereits beschrieben das Problem das ich nicht ganz in den Kopf bekomme wie Ich als Beispiel hier die Klasse Formulardialog dauerhaft geöffnet lasse ( folgende Sachen habe ich bereitsversucht)

1.) Die "" Show"" Methode ( hier verstehe ich mittlerweile wieso das nicht funktioniert das Fenster würde kurz geöffnet werden und danach ,,zerstört,,werden dadurch sieht man es so gut wie garnicht

2.) Die oben gezeigte Methode ( diese kommt aus einem anderen Beispiel der QT Doku hier öffnet sich jedoch gleich am Anfang beide Sachen was ich nicht möchte ,Ich möchte das sich das Fenster erst öffnet wenn Ich ihm das auch sage.

3.)Ich habe das Fenster schon mal dauerhaft am laufen gehabt in dem Ich einfach nur eine normale Methode aus dem Formulardialog gemacht habe ( def ......) da hat es auch alles geklappt (Ich verstehe auch wieso weil die Hauptschleife ja dauerhaft wieder durchlaufen wurde und so das bild auch dauerhaft angezeigt wurde...,mir ist es nur unglaublich wichtig das Ich das alles in einzelene Klassen mache ( jedes Unterprogramm vill ist das für den ein oder anderen nicht verständlich nur ich bin ein anfänger und so ist nunmal meine denkweise ( so kann ich das logisch nachvollziehen )

Ich hoffe ihr könnt mir ein denkanstoss in die richtige Richtung geben...

P.s Ich habe auch zum Teil gesehen das die Leute so vorgehen das Sie irgendwie die Namen ersetzten ( xyz = new xyz ) ist das vill die Lösung ?
Eine Vision ohne Aktion bleibe eine Illusion
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Problem wird sein, das du die Dialoge nicht aufgehoben hast. Leg sie in deiner Hauptklasse an als Instanz-Attribute. Also

self.formular_dialog = FormularDialog()

in HauptBildschirm.

Und du scheinst den Unterschied zwischen Klassen und deren Instanzen noch nicht ganz begriffen zu haben. Zu erkennen an dem falschen Argument an FormularDialog.

Und zu guter letzt: bitte folge den Konventionen in PEP8.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich entschuldige mich erstmal das Ich jetzt erst zeit habe um zu antworten,

das habe Ich im Nachtrag versucht ( dein vorschlag / hab mir die angesprochen Kaptiel nochmal durchgelesen allerdings funktioniert es noch nicht so richtig ) jedoch möchte Ich niemand sein dem alles vorgekaut wird ich werde es nochmal in ruhe die nächsten Woche ausprobieren und mich dann nochmal melden.

Zum Thema Konvention habe ich das gelesen ( 8 Leerzeichen bzw Tab benutzen ) ich vergesse das immmer mit den ganzen Linien in Pycharm da es dort im ersten Augenblick übersichtlich aussieht jedoch ist es natürlich wieder ein Punkt an den man Fehler vermeinden kann Ich danke dir für den Hinweis.

Ich werden einfach falls Ich es nicht allein gelöst bekommen nochmal drunter schreiben.
Eine Vision ohne Aktion bleibe eine Illusion
Antworten