QT嵌套窗口小部件框模型行为

QT嵌套窗口小部件框模型行为,qt,pyqt4,stylesheet,qtstylesheets,Qt,Pyqt4,Stylesheet,Qtstylesheets,我正在使用PyQt和Qt样式表编写一个应用程序,但在使用时遇到了一些问题 我能够用这个小层次的对象(每个对象都有一个BoxLayout)重现问题: 主窗口(QWidget的子类) QWidget 2x a QLabel 我的样式表非常简单: 标签的1px纯蓝色边框(3) 小部件的1px实心红色边框(2) 小部件的50像素边距(2) 我希望看到(从应用程序的顶部到中心): 50像素的余量 红边 标准布局间距/内容边距 蓝边 然而,情况并非如此。内部标签似乎不是相对于小部件的contentr

我正在使用PyQt和Qt样式表编写一个应用程序,但在使用时遇到了一些问题

我能够用这个小层次的对象(每个对象都有一个BoxLayout)重现问题:

  • 主窗口(QWidget的子类)
  • QWidget
  • 2x a QLabel
  • 我的样式表非常简单:

    • 标签的1px纯蓝色边框(3)
    • 小部件的1px实心红色边框(2)
    • 小部件的50像素边距(2)
    我希望看到(从应用程序的顶部到中心):

    • 50像素的余量
    • 红边
    • 标准布局间距/内容边距
    • 蓝边
    然而,情况并非如此。内部标签似乎不是相对于小部件的contentrect定位的,而是相对于外部窗口的contentrect定位的。标签(及其文本)的蓝色边框实际上延伸到其父窗口小部件的红色边框之外

    完整代码如下:

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

    两种可能的解决方案对我有效(但在Pyqt5中)

  • 使用QFrame而不是QWidget作为容器(卡)

  • 命名标签,比如label1和label2,然后添加以下命令

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

  • 在我看来,第一个更好,第二个只是一个解决办法

    谢谢,将QWidget更改为QFrame解决了我的问题!是否有任何(其他)原因使我应该使用一个而不是另一个?QFrame是作为一个容器使用的。它是一个从Qwidget继承的类,因此具有附加属性。可能您只想在从头开始构建自己的小部件时使用QWidget。我想每次都要看你想做什么。如果您只是想要一个易于使用的容器,那么可以选择Qframe。