Verhalten Stapellayout

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Haragius
User
Beiträge: 10
Registriert: Sonntag 23. Juni 2013, 14:04

Hallo zusammen,

ich versuche ein Stapellayout zwecks Übungen zu verwenden. Das funktioniert auch nur erhalte ich einen Schönheitsfehler.
Wenn ich das Programm starte, blizt für einige Millisekunden ein Fesnster auf bevor sich das eigentliche UI zeigt.
Könnte es daran liegen, dass das Stapellayout nicht das Hauptlayout ist?

PS: Ich habe den code auf das Stapellayout reduziert mit den Label's zur kontrolle um ein Beispiel mit dem Problem zu geben....

Code: Alles auswählen

from PyQt4 import QtGui
import sys

class mainWindow(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(QtGui.QMainWindow, self).__init__(parent)
        self.createMenu()
        self.createComponents()
        self.createLayouts()
        self.resize(400,400)

    def createMenu(self):
        pass

    def createComponents(self):
        self.btnNavi1 = QtGui.QPushButton("Seite1")
        self.btnNavi2 = QtGui.QPushButton("Seite2")
        self.btnNavi3 = QtGui.QPushButton("Seite3")
        self.label1 = QtGui.QLabel("1")
        self.label2 = QtGui.QLabel("2")
        self.label3 = QtGui.QLabel("3")
        self.seite1 = QtGui.QWidget()
        self.seite2 = QtGui.QWidget()
        self.seite3 = QtGui.QWidget()

    def createLayouts(self):
        layout_l1v = QtGui.QVBoxLayout()
        
        layout_l2h_Navi = QtGui.QHBoxLayout()
        layout_l2h_Navi.addWidget(self.btnNavi1)
        layout_l2h_Navi.addWidget(self.btnNavi2)
        layout_l2h_Navi.addWidget(self.btnNavi3)

        layout_l2s_Seiten = QtGui.QStackedLayout()
        layout_l2s_Seiten.addWidget(self.seite1)
        layout_l2s_Seiten.addWidget(self.seite2)
        layout_l2s_Seiten.addWidget(self.seite3)
        
        layout_seite1 = QtGui.QHBoxLayout()
        layout_seite1.addWidget(self.label1)
        
        layout_seite2 = QtGui.QHBoxLayout()
        layout_seite2.addWidget(self.label2)
        
        layout_seite3 = QtGui.QHBoxLayout()
        layout_seite3.addWidget(self.label3)

        self.seite1.setLayout(layout_seite1)
        self.seite2.setLayout(layout_seite2)
        self.seite3.setLayout(layout_seite3)
        
        layout_l1v.addLayout(layout_l2h_Navi)
        layout_l1v.addLayout(layout_l2s_Seiten)
        
        widgetZentral = QtGui.QWidget()
        widgetZentral.setLayout(layout_l1v)
        self.setCentralWidget(widgetZentral)
        
        self.btnNavi1.clicked.connect(lambda: layout_l2s_Seiten.setCurrentIndex(0))
        self.btnNavi2.clicked.connect(lambda: layout_l2s_Seiten.setCurrentIndex(1))
        self.btnNavi3.clicked.connect(lambda: layout_l2s_Seiten.setCurrentIndex(2))


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = mainWindow()
    window.show()
    sys.exit(app.exec())
Benutzeravatar
snafu
User
Beiträge: 6833
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mal abgesehen davon, dass du dir vielleicht mal Listen und Schleifen ansehen solltest, um deinen Code zu verbessern, kann ich den von dir beschriebenen Fehler nicht nachvollziehen: Es erscheint einfach nur ein Fenster mit 3 nebeneinander gesetzten Buttons. Ich kann hier keinerlei unerwünschte Effekte feststellen. Meine Wahrnehmung lässt allerdings im ganz niedrigen Millisekunden-Bereich etwas nach. :(

Unter welchem Betriebssystem und welcher grafischen Oberfläche läuft das Ganze denn?
Benutzeravatar
Haragius
User
Beiträge: 10
Registriert: Sonntag 23. Juni 2013, 14:04

Hmm eigenartig. Ich sehen das Fenster unter Gentoo mit Kde 4.10.3 und Windows7

Ich weis nun um welches Fenster es sich handelt nur eine Lösung habe ich noch keine.
Wen man nun die Zeile

Code: Alles auswählen

layout_l1v.addLayout(layout_l2s_Seiten)
auskommentiert bleibt das Fenster sichtbar und siehe da, es sind die definierten Seiten des Stapellayouts.
Aber warum sehe ich das Fenster kurz aufflackern wen die Zeile nicht auskommentiert ist?
lunar

@Haragius Du erzeugst alle Layouts und Steuerelemente ohne Angabe eines Vater-Steuerelements. Mithin hält Qt diese für unabhängige Steuerelemente, und gönnt ihnen ein eigenes Fenster.

Merke: Qt-Objekten immer ein "parent" mitgeben, im Regelfall das Fenster oder das Container-Element, in welchem die Steuerelemente dann angezeigt werden sollen.
Benutzeravatar
Haragius
User
Beiträge: 10
Registriert: Sonntag 23. Juni 2013, 14:04

Das klingt sehr plausibel. Gleich mal umsetzen. Danke
Benutzeravatar
Haragius
User
Beiträge: 10
Registriert: Sonntag 23. Juni 2013, 14:04

Danke euch beiden!

Das aufflackern des Stapellayouts ist weg und der Code ist nurnoch halb so lang.
Antworten