PyQt5 - QWidgets & QMainWindow gleichzeitig verwenden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Abend Leute, nach bissel weiterer Recherche hab ich nen Ansatz bezüglich QFrame.

Das ist mein Programm:

Code: Alles auswählen

########### Eigene CronusMax GamePack GUI (Graphical User Interface) ###########
# Importierung:
import sys, webbrowser
from PyQt5.QtWidgets import QApplication , QSplitter, QWidget, QMainWindow, QVBoxLayout, QAction, QFrame
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt

"""
ToDo:

"""

# Programm - Klasse
class ScriptGameInterface:
    def mainprocess(self):
        # Hauptfenster - QMainWindow:
         self.app = QApplication(sys.argv)
         self.mainwindow = QMainWindow()
         self.mainwindow.setGeometry(400,300,1100,540)
         self.mainwindow.setWindowTitle("xXSkyWalkerXx1 - Fortnite S.G.I. Tool")
         self.mainwindow.setWindowIcon(QIcon("/home/pi/Bilder/Ich/xXSkyWalkerXx1.jpg"))
         self.mainwindow.show()
         self.mainwindow.statusBar().showMessage("Fortnite Script.Game.Interface (S.G.I.) | V0.8")

        #Menü-Bar:
         menubar = self.mainwindow.menuBar()

         info = menubar.addMenu("Infos")
         update = menubar.addMenu("Update")
         shop = menubar.addMenu("Shop")
         generate = menubar.addMenu("Generate")
         exitMenu = menubar.addMenu("Exit")

         showAGB = QAction(QIcon("/home/pi/Bilder/AGB.jpg"), "TOS", self.mainwindow)
         showAGB.triggered.connect(self.showAGB)
         info.addAction(showAGB)
         
         openShopLink = QAction(QIcon("/home/pi/Bilder/selly.png"), "Shop", self.mainwindow)
         openShopLink.triggered.connect(self.openShop)
         shop.addAction(openShopLink)

         generateScript = QAction(QIcon("/home/pi/Bilder/generate.png"), "Generate", self.mainwindow)
         generateScript.triggered.connect(self.generate)
         generate.addAction(generateScript)

         ex = QAction(QIcon("/home/pi/Bilder/exit.jpg"), "Exit", self.mainwindow)
         ex.triggered.connect(self.Beenden)
         exitMenu.addAction(ex)

        # Frames/Layouts - QWidget:
         self.widgets = QWidget()
         
         self.vbox = QVBoxLayout()

         frameLeft = QFrame()
         frameLeft.setFrameShape(QFrame.StyledPanel)
         frameLeft.setStyleSheet("background-color:blue;")
         frameRight = QFrame()
         frameLeft.setStyleSheet("background-color:red;")
         frameRight.setFrameShape(QFrame.StyledPanel)

         splitter = QSplitter(Qt.Vertical)
         splitter.addWidget(frameLeft)
         splitter.addWidget(frameRight)

         self.vbox.addWidget(splitter)
         self.widgets.setLayout(self.vbox)
         
         self.widgets.show() #Widgets anzeigen 
         
    def Beenden(self):
        self.mainwindow.destroy()
        self.app.destroy()
        
    def check_updates(self):
        pass

    def openShop(self):
        webbrowser.open("https://selly.gg/@xXSkyWalkerXx1")
        
    def showAGB(self):
        webbrowser.open("https://www.dropbox.com/s/40giw67xmhjbhed/AGB.txt?dl=0")

    def generate(self):
        FortniteSkript = "In process!"
        script = open("/home/pi/Schreibtisch/Fortnite - GamePack.gpc", "w+")
        script.write(FortniteSkript)
        script.close()

# Hauptkörper - "main"
Interface = ScriptGameInterface()
Interface.mainprocess()
sys.exit(Interface.app.exec_())
Das Problem ist, dass ein neues Fenster erzeugt wird, in dem 2 Frames dargestellt werden, allerdings scheinbar horizontal statt vertikal und auch kein blaues.
Jemand ne Ahnung woran's liegt? :)

Ich hab ein Programm, in Tkinter geschrieben, welches ich nämlich nun in PyQt5 umschreiben möchte (aufgrund mehrerer Möglichkeiten) - habe aber noch nicht so viel Ahnung von PyQt5 und viel gibts da auch nicht zu lesen.
Tkinter war sooo leicht! :D

Mir freundlichen Grüßen,
xXSkyWalkerXx1
Benutzeravatar
__blackjack__
User
Beiträge: 13065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es gibt die Qt-Dokumentation. Ich finde die recht umfangreich. Und gut.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Auf der Pythonseite direkt oder wo?
EDIT: oder meinst diese Seite: https://doc.qt.io/qtforpython/index.html ?

Und hast auch ne Ahnung was ich im Prog. falsch gemacht habe?
Benutzeravatar
__blackjack__
User
Beiträge: 13065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich meine die Original-Qt-Dokumentation für C++.

In welcher Zeile sagst Du denn das was im Hauptfenster angezeigt werden soll?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

In welcher Zeile sagst Du denn das was im Hauptfenster angezeigt werden soll?

Code: Alles auswählen

########### Eigene CronusMax GamePack GUI (Graphical User Interface) ###########
# Importierung:
import sys, webbrowser
from PyQt5.QtWidgets import QApplication , QSplitter, QWidget, QMainWindow, QVBoxLayout, QAction, QFrame
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt

"""
ToDo:

"""

# Programm - Klasse
class ScriptGameInterface:
    def mainprocess(self):
        # Hauptfenster - QMainWindow:
         self.app = QApplication(sys.argv)
         self.mainwindow = QMainWindow()
         self.mainwindow.setGeometry(400,300,1100,540)
         self.mainwindow.setWindowTitle("xXSkyWalkerXx1 - Fortnite S.G.I. Tool")
         self.mainwindow.setWindowIcon(QIcon("/home/pi/Bilder/Ich/xXSkyWalkerXx1.jpg"))
         self.mainwindow.show()
         #---------------------------------------------------------------------------------------------------------------------------------- Aufruf von dem was dargestellt wird
         self.mainwindow.statusBar().showMessage("Fortnite Script.Game.Interface (S.G.I.) | V0.8")
         #----------------------------------------------------------------------------------------------------------------------------------
        #Menü-Bar: 
         menubar = self.mainwindow.menuBar()
         #---------------------------------------------------------------------------------------------------------------------------------- Aufruf von dem was dargestellt wird
         info = menubar.addMenu("Infos")
         update = menubar.addMenu("Update")
         shop = menubar.addMenu("Shop")
         generate = menubar.addMenu("Generate")
         exitMenu = menubar.addMenu("Exit")
         #---------------------------------------------------------------------------------------------------------------------------------- 
         showAGB = QAction(QIcon("/home/pi/Bilder/AGB.jpg"), "TOS", self.mainwindow)
         showAGB.triggered.connect(self.showAGB)
         info.addAction(showAGB)
         
         openShopLink = QAction(QIcon("/home/pi/Bilder/selly.png"), "Shop", self.mainwindow)
         openShopLink.triggered.connect(self.openShop)
         shop.addAction(openShopLink)

         generateScript = QAction(QIcon("/home/pi/Bilder/generate.png"), "Generate", self.mainwindow)
         generateScript.triggered.connect(self.generate)
         generate.addAction(generateScript)

         ex = QAction(QIcon("/home/pi/Bilder/exit.jpg"), "Exit", self.mainwindow)
         ex.triggered.connect(self.Beenden)
         exitMenu.addAction(ex)
        # Frames/Layouts - QWidget:
         self.widgets = QWidget()
         
         self.vbox = QVBoxLayout()

         frameLeft = QFrame()
         frameLeft.setFrameShape(QFrame.StyledPanel)
         frameLeft.setStyleSheet("background-color:blue;")
         frameRight = QFrame()
         frameLeft.setStyleSheet("background-color:red;")
         frameRight.setFrameShape(QFrame.StyledPanel)

         splitter = QSplitter(Qt.Vertical)
         splitter.addWidget(frameLeft)
         splitter.addWidget(frameRight)

         self.vbox.addWidget(splitter)
         self.widgets.setLayout(self.vbox)
         #---------------------------------------------------------------------------------------------------------------------------------- Aufruf von dem was dargestellt wird (Frames, vertikal geteilt) (naja, sollte^^)
         self.widgets.show() #Widgets anzeigen 
         #----------------------------------------------------------------------------------------------------------------------------------
    def Beenden(self):
        self.mainwindow.destroy()
        self.app.destroy()
        
    def check_updates(self):
        pass

    def openShop(self):
        webbrowser.open("https://selly.gg/@xXSkyWalkerXx1")
        
    def showAGB(self):
        webbrowser.open("https://www.dropbox.com/s/40giw67xmhjbhed/AGB.txt?dl=0")

    def generate(self):
        FortniteSkript = "In process!"
        script = open("/home/pi/Schreibtisch/Fortnite - GamePack.gpc", "w+")
        script.write(FortniteSkript)
        script.close()

# Hauptkörper - "main"
Interface = ScriptGameInterface()
Interface.mainprocess()
sys.exit(Interface.app.exec_())
Habe es direkt im Code markiert.
Sollte das Richtige sein, wenn ich dich richtig verstanden habe.
Benutzeravatar
__blackjack__
User
Beiträge: 13065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dann hast Du das falsch verstanden. Du musst schon sagen was in dem Hauptfenster als zentrales Widget angezeigt werden soll, sonst weiss Qt nicht das Du da kein eigenes Fenster aus dem Inhalt machen willst. Schau Dir doch mal die Dokumentation von `QMainWindow` an.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ich verstehe nicht ganz, aber wozu wird den ein zentrales Widget benötigt und wenn ich aber im Prinzip keine nehmen kann, da ich erstmal 2 Frames platzieren will, die das Fenster einteilen?
Ich habe schonmal wegen den anderen PyQt Widgets geschaut, das ist simple, aber mit den Frames checke ich das nicht und meiner Meinung nach findet man auch nichts, wo das relativ gut erklärt wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich verstehe die Frage nicht so ganz. An der Stelle wo das zentrale Widget im Hauptfenster sitzt, willst Du ja was anzeigen. *Du* brauchst da ja was. Ein (Haupt)Fenster ohne irgend etwas drin macht keinen Sinn. Wie kannst Du da fragen *warum* da etwas sein muss wenn Du doch etwas dort haben möchtest‽

Wenn Du den zentralen Bereich einteilen möchtest, musst Du dort halt ein Widget reinsetzen das Du dann einteilst. Also letztlich genau das was Du ja schon machst, ausser das Du halt nicht sagst es soll in das Hauptfenster gesetzt werden. Da Du das nicht sagst, hat das Widget kein Elternwidget und Widgets ohne Eltern sind in Qt Fenster.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Dankee! :)) Habs jetzt! ^^
Hab Frame als ZentralWidget gesetzt und es ging! :)
Antworten