setSizePolicy() 与 QSizePolicy.Expanding 不起作用:子级没有扩展到父级的大小

Posted

技术标签:

【中文标题】setSizePolicy() 与 QSizePolicy.Expanding 不起作用:子级没有扩展到父级的大小【英文标题】:setSizePolicy() with QSizePolicy.Expanding does not work: the child does not expand to the size of the parent 【发布时间】:2019-01-20 12:51:27 【问题描述】:

根据http://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum,设置widget的大小策略有如下效果:

sizeHint() 是一个合理的尺寸,但小部件可以缩小并 还是有用的。小部件可以利用额外的空间,所以它应该 获得尽可能多的空间(例如 水平滑块)。

所以,我希望下面的黄色小部件能够填满绿色小部件,但这不会发生。我做错了什么?

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Yellow(QWidget):

    def __init__(self, *args):
        super().__init__(*args)

        # Set palette
        bg = QPalette()
        bg.setColor(QPalette.Window, Qt.yellow)
        self.setAutoFillBackground(True)
        self.setPalette(bg)

        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

class Green(QWidget):

    def __init__(self, *args):
        super().__init__(*args)

        # Set palette
        bg = QPalette()
        bg.setColor(QPalette.Window, Qt.green)
        self.setAutoFillBackground(True)
        self.setPalette(bg)

        self.yellow = Yellow(self)

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5'
        self.left = 10
        self.top = 10
        self.width = 200
        self.height = 200 
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.green = Green(self)
        self.green.resize(184, 154)
        self.green.move(10, 10)

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)

    ex = App()
    sys.exit(app.exec_())

【问题讨论】:

认为(但我不确定)您需要围绕小部件进行布局。 @TrebuchetMS 你是对的 :) 不知道需要它 【参考方案1】:

使用布局:

class Green(QWidget):

    def __init__(self, *args):
        super().__init__(*args)

        # Set palette
        bg = QPalette()
        bg.setColor(QPalette.Window, Qt.green)
        self.setAutoFillBackground(True)
        self.setPalette(bg)

        self.yellow = Yellow(self)
        self.myLayout = QGridLayout()
        self.myLayout.addWidget(self.yellow)
        self.setLayout(self.myLayout)

结果:

如果添加self.myLayout.setContentsMargins(0,0,0,0),黄色小部件将完全覆盖绿色小部件:

【讨论】:

以上是关于setSizePolicy() 与 QSizePolicy.Expanding 不起作用:子级没有扩展到父级的大小的主要内容,如果未能解决你的问题,请参考以下文章

Qt ------ setSizePolicy

Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ign

Qt:窗口大小的执行方法?

为标签页设置中心小部件

Qt Designer 的自定义动作插件

Qt如何改变gridlayout列的大小