081.PyQt5_QSizePolicy_控件尺寸策略

  

我 的 个 人 主 页: 失心疯的个人主页
入 门 教 程 推 荐 : Python零基础入门教程合集
虚 拟 环 境 搭 建 : Python项目虚拟环境(超详细讲解)
PyQt5 系 列 教 程: Python GUI(PyQt5)文章合集
Oracle数据库教程: Oracle数据库文章合集
优 质 资 源 下 载 : 资源下载合集

QSizePolicy 控件尺寸策略

  • 在学习QSizePolicy之前,我们先了解一下两个方法
  • QWidget.sizeHint()
    • 设置默认展示的建议大小
      • size()的参照。但并不一定是最终的size()
    • 取值
      • 无布局:无效值,isValid()是False
      • 有布局:一般是根据内容来确定,会自动分配,不需要管
    • 可以选择重写此方法进行测试
  • QWidget.minimumSizeHint()
    • 设置最小的建议大小,minimumSize()的参照
    • 取值
      • 无布局:无效值,isValid()是False
      • 有布局:一般是根据内容来确定,会自动分配,不需要管
    • layout永远也不会吧一个控件的尺寸设置到比minimumSizeHint()还小
    • 除非控件单独设置了最小尺寸setMinimumSize()或者尺寸策略为Ignored

  • QSizePolicy 控件的尺寸策略
  • 一个控件的尺寸策略会告诉布局系统应该如何对他进行拉伸和收缩
  • Qt为它所有的内置控件都提供了合理的默认大小策略值
  • 一个QSizePolicy包括
    • 水平方向策略
    • 水平方向拉伸系数
    • 垂直方向策略
    • 垂直方向拉伸系数
  • 注意:之前讲的拉伸系数,是在策略设置了可以被拉伸为前提
  • 设置控件尺寸策略
    setSizePolicy(self, QSizePolicy)                                # 通过QSizePolicy对象设置控件尺寸策略
    setSizePolicy(self, QSizePolicy.Policy,QSizePolicy.Policy)      # 通过QSizePolicy对象枚举值设置控件水平和垂直的尺寸策略
    
  • QSizePolicy枚举值
    QSizePolicy.Fixed                   # widget的实际尺寸只参考sizeHint()的返回值,不能伸展(grow)和收缩(shrink)
    QSizePolicy.Minimum                 # 可以伸展和收缩,不过minimumSizeHint()的返回值规定了widget能缩小到的最小尺寸
    QSizePolicy.Maximum                 # 可以伸展和收缩,不过sizeHint()的返回值规定了widget能伸展到的最大尺寸
    QSizePolicy.Preferred                # 可以伸展和收缩,但没有优势去获取更大的额外控件使自己的尺寸比sizeHint()的返回值更大
    QSizePolicy.Expanding               # 可以伸展和收缩,它会尽可能多的去获取额外的控件,比Preferred更具优势
    QSizePolicy.MinimumExpanding        # 可以伸展和收缩,不过minimumSizeHint()的返回值规定了widget能缩小到的最小尺寸。它比preferred更具优势获取额外控件
    QSizePolicy.Ignored                 # 忽略sizeHint()的作用
    
  • QSizePolicy对象
    • 构造方法
      # 创建QSizePolicy对象
      QSizePolicy()
      
      # 创建QSizePolicy对象的同时,通过QSizePolicy的枚举值设置水平和垂直方向策略
      QSizePolicy(QSizePolicy.Policy, QSizePolicy.Policy, type: QSizePolicy.ControlType = QSizePolicy.DefaultType)
      
      QSizePolicy(Any)
      QSizePolicy(QSizePolicy)
      
    • 功能作用
      setHorizontalPolicy(self, QSizePolicy.Policy)       # 设置水平方向策略
      setHorizontalStretch(self, int)                     # 设置水平方向伸缩因子
      
      setVerticalPolicy(self, QSizePolicy.Policy)         # 设置垂直方向策略
      setVerticalStretch(self, int)                       # 设置垂直方向伸缩因子
      
      setRetainSizeWhenHidden(self, bool)                 # 设置控件隐藏时是否保留空间
      setHeightForWidth(self, bool)                       # 设置小部件的首选高度是否取决于其宽度
      setWidthForHeight(self, bool)                       # 设置小部件的首选宽度是否取决于其高度
      expandingDirections(self) -> Qt.Orientations        # 返回一个部件是否可以比sizeHint()使用更多的空间
      

  • 示例代码
  • 示例1:QSizePolicy-初体验
    from PyQt5.Qt import *
    import sys
    
    class MyLabel(QLabel):
        def sizeHint(self):
            return QSize(200, 50)
        def minimumSizeHint(self):
            return QSize(100, 10)
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QSizePolicy-初体验')
            self.resize(500, 500)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
    
        def add_widget(self):
            lab1 = QLabel('标签1')
            lab2 = QLabel('标签2')
            lab3 = QLabel('标签3')
    
            btn1 = QPushButton('按钮1')
            btn2 = QPushButton('按钮2')
            btn3 = QPushButton('按钮3')
    
            mlab1 = MyLabel('自定义标签1')
            mlab2 = MyLabel('自定义标签2')
            mlab3 = MyLabel('自定义标签3')
    
            lab1.setStyleSheet('background-color:cyan;')
            lab2.setStyleSheet('background-color:yellow;')
            lab3.setStyleSheet('background-color:green;')
    
            mlab1.setStyleSheet('background-color:cyan;')
            mlab2.setStyleSheet('background-color:yellow;')
            mlab3.setStyleSheet('background-color:green;')
    
            lab_v_layout = QVBoxLayout()
            btn_v_layout = QVBoxLayout()
            mlab_v_layout = QVBoxLayout()
            h_layout = QHBoxLayout()
    
            self.setLayout(h_layout)
            h_layout.addLayout(lab_v_layout)
            h_layout.addLayout(btn_v_layout)
            h_layout.addLayout(mlab_v_layout)
    
            lab_v_layout.addWidget(lab1)
            lab_v_layout.addWidget(lab2)
            lab_v_layout.addWidget(lab3)
    
            btn_v_layout.addWidget(btn1)
            btn_v_layout.addWidget(btn2)
            btn_v_layout.addWidget(btn3)
    
            mlab_v_layout.addWidget(mlab1)
            mlab_v_layout.addWidget(mlab2)
            mlab_v_layout.addWidget(mlab3)
    
            # 方法1:通过QSizePolicy的枚举值设置水平和垂直方向的策略
            # mlab1.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            # mlab2.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Minimum)
            mlab1.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
            mlab2.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
            mlab3.setSizePolicy(QSizePolicy.MinimumExpanding,QSizePolicy.MinimumExpanding)
    
            # 方法2:通过QSizePolicy对象设置策略
            # sp = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
            # sp = QSizePolicy()
            # sp.setVerticalPolicy(QSizePolicy.Preferred)
            # sp.setHorizontalPolicy(QSizePolicy.Expanding)
            # mlab3.setSizePolicy(sp)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())

你可能感兴趣的:(PyQt5,pyqt5,python,gui,python,pyqt,qt)