Я пишу приложение с использованием PyQt и Qt StyleSheets, но возникли некоторые проблемы с BoxModel.поведение модели вложенных виджета QT
Я был в состоянии воспроизвести проблему с этой небольшой иерархии объектов (каждый с BoxLayout):
- MainWindow (подкласс QWidget)
- QWidget
- 2 раза в QLabel
Моя таблица стилей очень прост:
- в 1px сплошных синих границ для этикеток (3)
- в 1px Сплошной красной границы для виджета (2)
- перевеса 50px для виджета (2)
я бы ожидал увидеть (от верхней части к центру приложения):
- маржа 50px
- красная граница
- стандартное расстояние между компоновкой/contentmargin
- Синяя граница
Однако, это не тот случай. Кажется, что внутренние ярлыки не расположены относительно содержимого прямоугольника виджета, а вместо этого - для содержимого прямоугольника внешнего окна. Синяя граница надписей (и их текста) фактически распространяется за пределы красной границы их родительского виджета.
Полный код здесь:
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())
Спасибо, изменение QWidget к QFrame решает мою проблему! Существуют ли какие-либо (другие) причины, почему я должен использовать один над другим? –
QFrame предназначен для использования в качестве контейнера. Это класс, который наследуется от Qwidget, поэтому он обладает дополнительными свойствами. Возможно, вам захочется использовать QWidget только тогда, когда вы хотите создать собственный виджет с самой нуля. Думаю, каждый раз это зависит от того, что вы хотите сделать. Если вам нужен простой в использовании контейнер, вы выбираете Qframe. – finmor