【问题标题】:QT nested widgets box model behaviourQT 嵌套小部件框模型行为
【发布时间】:2014-02-04 06:38:16
【问题描述】:

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

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

  1. MainWindow(QWidget 的子类)
  2. QWidget
  3. 2x 一个 QLabel

我的样式表很简单:

  • 标签的 1 像素纯蓝色边框 (3)
  • 小部件的 1 像素纯红色边框 (2)
  • 小部件的 50 像素边距 (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())

【问题讨论】:

    标签: qt pyqt4 stylesheet qtstylesheets


    【解决方案1】:

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

    1. 使用 QFrame 而不是 QWidget 作为您的容器(卡片)

    2. 给你的标签命名,比如 label1 和 label2,然后添加以下命令

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

    我认为第一个更好,第二个只是一种解决方法

    【讨论】:

    • 谢谢,将 QWidget 更改为 QFrame 解决了我的问题!是否有任何(其他)原因我应该使用其中一个?
    • QFrame 被用作容器。它是一个继承自 Qwidget 的类,因此它具有额外的属性。可能只有当您想从头开始构建自己的小部件时才需要使用 QWidget。我想每次都取决于你想做什么。如果您只想要一个易于使用的容器,您可以选择 Qframe。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多