2016-04-24 7 views
0

Ich versuche, einen horizontalen Frame mit einem Label in einen vertikalen Frame einzufügen, aber obwohl das Label angezeigt wird, ist es nicht in der richtigen Position und ist auf die Größe eines Standard-QLabel beschränktSubclassed QFrame passt sich nicht an das Layout an

Dies ist die Hauptklasse:

class Launcher(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.setFrame() #sets up window's geometry, works fine 
     self.setContent() 
     self.show() 

    def setContent(self): 
     layout = QBoxLayout(QBoxLayout.TopToBottom) 
     layout.addWidget(widgets.Logo(self), 0, Qt.AlignTop) 
     self.setLayout(layout) 

Und das ist die importierte Klasse von einem "Widgets" Modul

class Logo(QFrame): 
    def __init__(self, parent): 
     super().__init__(parent) 
     layout = QBoxLayout(QBoxLayout.LeftToRight) 
     text = QLabel("PyTitle", self) 
     text.setAlignment(Qt.AlignCenter) 
     text.setFont(QFont("impact", 48)) 
     layout.addWidget(text, 0, Qt.AlignCenter) 
     self.setLayout(layout) 
     self.show() 

das Ergebnis ist folgendes: enter image description here

Wenn ich sowohl QLabel AND QFrame zwingend Größe ändert, ist es sichtbar, aber immer noch in der oberen linken Ecke.

+0

Gibt es einen Grund, warum Sie QBoxLayout und nicht QHBoxLayout verwenden? Wenn Sie nur eine Reihe von Widgets von links nach rechts gestapelt haben möchten, verwenden Sie QHBoxLayout, und wenn Sie möchten, dass sie von oben nach unten gestapelt werden, verwenden Sie QVBoxLayout. Ich würde mich nie mit QBoxLayout anlegen. Aus den Dokumenten für QBoxLayout: "Sie werden fast immer QVBoxLayout und QHBoxLayout anstelle von QBoxLayout wegen ihrer praktischen Konstruktoren verwenden." – neuronet

Antwort

1

Sie müssen kein Layout auf QMainWindow setzen, da es bereits einen eingebauten (um Dock-Widgets, die Menüleiste, Statusleiste usw. zu behandeln).

stattdessen eine central-widget gesetzt, und fügen Sie alle Widgets und Layouts, dass:

class Launcher(QMainWindow): 
    ... 
    def setContent(self): 
     widget = widgets.Logo(self) 
     self.setCentralWidget(widget) 

(PS: Sie show() auf dem Top-Level-Fenster aufrufen müssen - für alle anderen Kind-Widgets, es ist redundant).