2016-04-24 7 views
0

Я пытаюсь включить горизонтальную рамку, содержащую метку внутри вертикальной рамки, но даже при том, что метка отображается, она не находится в правильном положении и ограничена размером стандартного QLabelПодклассифицированный QFrame не настраивается на его макет

Это главный класс:

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) 

И это импортированная класс от "виджетов" модуль

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() 

результат таков: enter image description here

Если я решительно изменяю размер как QLabel, так и QFrame, это видно, но все же в верхнем левом углу.

+0

Есть ли причина, по которой вы используете QBoxLayout, а не QHBoxLayout? Если вам просто нужна куча виджетов, уложенных слева направо, используйте QHBoxLayout, и если вы хотите, чтобы они укладывали сверху вниз, используйте QVBoxLayout. Я бы никогда не возился с QBoxLayout. Из документов для QBoxLayout: «Вы почти всегда будете хотеть использовать QVBoxLayout и QHBoxLayout, а не QBoxLayout из-за их удобных конструкторов». – neuronet

ответ

1

Вы не должны устанавливать макет на QMainWindow, поскольку он уже имеет один встроенный (для обработки док-виджета, панели меню, строки состояния и т. Д.).

Вместо этого установите central-widget, и добавить все виджеты и макеты, которые:

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

(PS: Вам нужно только позвонить show() на окна верхнего уровня - для всех остальных дочерних виджетов, это избыточный).