2014-01-15 2 views
3

Я пишу приложение с использованием PyQt и Qt StyleSheets, но возникли некоторые проблемы с BoxModel.поведение модели вложенных виджета QT

Я был в состоянии воспроизвести проблему с этой небольшой иерархии объектов (каждый с BoxLayout):

  1. MainWindow (подкласс QWidget)
  2. QWidget
  3. 2 раза в QLabel

Моя таблица стилей очень прост:

  • в 1px сплошных синих границ для этикеток (3)
  • в 1px Сплошной красной границы для виджета (2)
  • перевеса 50px для виджета (2)

я бы ожидал увидеть (от верхней части к центру приложения):

  • маржа 50px
  • красная граница
  • стандартное расстояние между компоновкой/contentmargin
  • Синяя граница

Однако, это не тот случай. Кажется, что внутренние ярлыки не расположены относительно содержимого прямоугольника виджета, а вместо этого - для содержимого прямоугольника внешнего окна. Синяя граница надписей (и их текста) фактически распространяется за пределы красной границы их родительского виджета.

Screenshot showing the issue

Полный код здесь:

import sys 

from PyQt4 import QtGui 

qss_string = """ 
QWidget#card { 
    border: 1px solid red; 
    margin: 50px; 
} 

QLabel { 
    border: 1px solid blue; 
} 
""" 

class MainWindow(QtGui.QWidget): 
    def __init__(self, parent = None): 
    super(MainWindow, self).__init__(parent) 

    window_layout = QtGui.QHBoxLayout() 

    card = QtGui.QWidget(self) 

    widget_layout = QtGui.QVBoxLayout() 
    widget_layout.addWidget(QtGui.QLabel("a long testing text which should fit inside a box", card)) 
    widget_layout.addWidget(QtGui.QLabel("a short text", card)) 
    card.setLayout(widget_layout) 

    card.setObjectName("card") 
    window_layout.addWidget(card) 

    self.setLayout(window_layout) 

    self.setObjectName("window") 
    self.setStyleSheet(qss_string) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    main_window = MainWindow() 
    main_window.show() 
    return app.exec_() 


if __name__ == "__main__": 
    sys.exit(main()) 

ответ

2

два возможных решения, которые работали для меня (в Pyqt5 однако)

  1. Использование QFrame вместо QWidget в контейнере ()

  2. Назовите свои ярлыки, чтобы сказать label1 и label2, а затем добавьте следующие команды

    label1.setStyleSheet("QLabel{margin:50px;margin-bottom:0px;}") 
    label2.setStyleSheet("QLabel{margin:50px;margin-top:0px;}") 
    

На мой взгляд, первый один лучше, второй просто обходной путь

+0

Спасибо, изменение QWidget к QFrame решает мою проблему! Существуют ли какие-либо (другие) причины, почему я должен использовать один над другим? –

+0

QFrame предназначен для использования в качестве контейнера. Это класс, который наследуется от Qwidget, поэтому он обладает дополнительными свойствами. Возможно, вам захочется использовать QWidget только тогда, когда вы хотите создать собственный виджет с самой нуля. Думаю, каждый раз это зависит от того, что вы хотите сделать. Если вам нужен простой в использовании контейнер, вы выбираете Qframe. – finmor

Смежные вопросы