QT嵌套小部件框模型行为

时间:2014-01-15 16:51:51

标签: qt pyqt4 stylesheet qtstylesheets

我正在使用PyQt和Qt StyleSheets编写应用程序,但BoxModel存在一些问题。

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

  1. MainWindow(QWidget的子类)
  2. QWidget的
  3. 2x a QLabel
  4. 我的样式表非常简单:

    • 标签的1px纯蓝色边框(3)
    • 小部件的1px纯红色边框(2)
    • 小部件(2)的50px余量

    我希望看到(从应用程序的顶部到中心):

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

1 个答案:

答案 0 :(得分:2)

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

  1. 使用QFrame代替QWidget作为容器(卡片)

  2. 将标签命名为label1和label2,然后添加以下命令

    label1.setStyleSheet("QLabel{margin:50px;margin-bottom:0px;}")
    label2.setStyleSheet("QLabel{margin:50px;margin-top:0px;}")
    
  3. 在我看来,第一个更好,第二个只是一个解决方法