QWidgets wechseln

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Douchbag
User
Beiträge: 9
Registriert: Freitag 4. März 2016, 17:39

Hallo zusammen,

ich möchte momentan über eine Toolbar einfach zwischen verschiedenen Widgets wechseln und sie anzeigen lassen. Hab damit aber irgendwie Schwierigkeiten. Momentan funktioniert mein Code nicht. Vielleicht kann mir jemand mal einen Tipp geben und drüber schauen. Danke schonmal.

Code: Alles auswählen

from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QVBoxLayout
from PyQt5.QtGui import QIcon
from src.WNew import WNew


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        self.layout = QVBoxLayout()
        self.layout.addStretch(1)
        self.content = None

        # Init UI
        self.initUI()

    def initUI(self):

        # Window Options
        self.setMinimumSize(1024, 768)
        self.setWindowTitle('GDiary')

        # Actions
        newAction = QAction(QIcon('icons/plus.png'), '&New', self)
        quitAction = QAction(QIcon('icons/logout.png'), '&Quit', self)

        # Connect
        newAction.triggered.connect(lambda: self.setPanel("new"))
        quitAction.triggered.connect(qApp.quit)

        # Toolbar
        self.toolbar = self.addToolBar('Quit')
        self.toolbar.addAction(newAction)
        self.toolbar.addAction(quitAction)

        # Layout
        self.layout.addWidget(self.toolbar)
        self.layout.addWidget(self.content)

        self.show()

    def setPanel(self, name):
        if (name == "new"):
            self.content = WNew()

Code: Alles auswählen

from PyQt5.QtWidgets import QWidget, QLineEdit, QHBoxLayout, QVBoxLayout, QPushButton
from PyQt5.QtGui import QTextLine


class WNew(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI

    def initUI(self):

        layout = QVBoxLayout()
        buttonOK = QPushButton()
        text = QLineEdit()

        layout.addWidget(text)
Im Endeffekt will ich einfach nur die angezeigten Widgets per Button wechseln. Jemand eine Idee? Irgendwie ging das mit C++ sehr einfach über pointer.
BlackJack

@Douchbag: Was soll denn ``self.layout.addWidget(self.content)`` bewirken wenn man doch an der Stelle genau weiss, dass `self.content` an den Wert `None` gebunden ist?

Du benutzt das `QMainWindow` falsch. Bei dem Typ ist ja gerade der Mehrwert, dass man da nicht alles selbst layoutet, sondern so etwas wie Toolbars, Dockbereiche, und Statuszeile über die speziellen Methoden hinzufügt und nur *ein* Widget für den Haupt-/Mittelteil als `setCentralWidget()` setzt.

Für mehrere Widgets, die zudem auch noch dynamisch hinzufügbar sein sollen, nimmt man in der Regel ein `QTabWidget` oder ein `QStackedWidget` (wenn man die Reiter aus irgendwelchen Gründen nicht haben möchte) als Container für die Widgets. Beim `QMainWindow` eventuell auch `QDockWidgets` als Verpackung um ein einzelnes Widget.

Ein Package `src` zu nennen ist keine wirklich gute Idee.

Beim `MainWindow` ist mir die logische Trennung zwischen `__init__()` und `initUI()` nicht klar. Wonach entscheidest Du was wo drin steht? Und warum überhaupt eine `initUI()`?

Die `setPanel()`-Methode macht so wie sie da steht nicht viel Sinn. Und selbst wenn noch andere Sachen abgeprüft werden: Wenn man zum Erstellen eines neuen Widgets das Argument 'new' angeben muss, kann an der Stelle auch eine `addPanel()`-Methode aufrufen, statt in `setPanel()` mehr als eine Aufgabe zu erledigen, je nach dem welchen Wert das Argument hat.

Um die Bedingung beim ``if`` gehören keine Klammern.

``self.content = WNew()`` setzt kein Elternobjekt für das `WNew`-Exemplar und fügt das auch nirgends der GUI hinzu. Das müsstest Du ja, wenn Du das so ungewöhnlich lösen möchtest, an der entsprechenden Stelle in das Layout setzen.

Bei `WNew` wird die `initUI()`-Methode nicht aufgerufen.

Falls sie aufgerufen würde, hat keines der Objekte dort ein Elternobjekt. Man muss hier auch auf die C++-Seite ein bisschen achten, das dort die Objekthierarchie stimmt.
Douchbag
User
Beiträge: 9
Registriert: Freitag 4. März 2016, 17:39

Danke für die vielen Punkte. Ich werde mir das mal alles anschauen.
Antworten