我在Designer中有一个布局,如下所示:

enter image description here

只是我希望listWidget尽可能小,并且只根据容纳所有项所需的最小高度垂直扩展.然而,由于某些原因,它拒绝合作,只是保持默认大小.我试着做了很多事情来改变它:

  1. 将extLabel的拉伸因子设置为ListWidget为1,0
  2. 将ListWidget及其所在的小部件的sizePolicy设置为最小
  3. 设置要调整的ListWidget的大小模式
  4. 将按钮的sizePolicy(我希望它填满所有剩余空间)设置为Expanding
  5. 将小工具对按钮的拉伸系数设置为0,1

但这些都不管用.此外,尽管没有为任何内容设置最小大小,但窗口似乎不能变得更小,这使我相信ListWidget有一个不可见的最小大小,该大小与属性中显示的最小大小无关.有人知道怎么解决这个问题吗?

编辑:在接受了使用首选大小策略和展开按钮的建议后,它仍然不想工作.以下是供参考的UI文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>318</width>
    <height>277</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,0">
   <property name="spacing">
    <number>0</number>
   </property>
   <property name="leftMargin">
    <number>0</number>
   </property>
   <property name="topMargin">
    <number>0</number>
   </property>
   <property name="rightMargin">
    <number>0</number>
   </property>
   <property name="bottomMargin">
    <number>0</number>
   </property>
   <item>
    <widget class="QWidget" name="widget" native="true">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Minimum" vsizetype="Maximum">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="baseSize">
      <size>
       <width>0</width>
       <height>0</height>
      </size>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0">
      <property name="spacing">
       <number>0</number>
      </property>
      <property name="sizeConstraint">
       <enum>QLayout::SetDefaultConstraint</enum>
      </property>
      <property name="leftMargin">
       <number>0</number>
      </property>
      <property name="topMargin">
       <number>0</number>
      </property>
      <property name="rightMargin">
       <number>0</number>
      </property>
      <property name="bottomMargin">
       <number>0</number>
      </property>
      <item>
       <widget class="QLabel" name="label">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QListWidget" name="listWidget">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="sizeAdjustPolicy">
         <enum>QAbstractScrollArea::AdjustToContents</enum>
        </property>
        <property name="resizeMode">
         <enum>QListView::Fixed</enum>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <widget class="QPushButton" name="pushButton">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

推荐答案

将拉伸系数设置为默认值,然后

  1. 设置QListWidget将垂直大小策略设置为Preferred
  2. QPushButton垂直大小策略设置为Expanding
  3. QLabel垂直大小策略设置为Maximum
  4. QListWidget的sizeAdjuctPolicy设置为AdjustToContents

QT的规模政策并不是乍看上go 的那样.Minimum实际上意味着你要尽可能多地成长.Maximum实际上意味着你可以尽可能地缩小.你可以在Qt docs强中了解到更多关于他们的信息

您可以做的最后一部分是重写QListWidget.sizeHint方法以动态调整列表中的项目数.

以下是一个可运行的示例:

from PySide6.QtCore import *
from PySide6.QtWidgets import *

class ListWidget(QListWidget):

    def sizeHint(self):
        size = super().sizeHint()
        frame = self.frameWidth() * 2
        items_height = self.count() * self.sizeHintForRow(0)
        height = min(super().maximumHeight(), items_height)
        size.setHeight(height + frame)
        return size

    def minimumSizeHint(self):
        return self.sizeHint()

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.resize(318, 277)
        self.centralwidget = QWidget(self)
        self.verticalLayout = QVBoxLayout(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Preferred)
        sizePolicy1 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
        sizePolicy2 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Maximum)
        self.setCentralWidget(self.centralwidget)
        self.label = QLabel('Label', self.centralwidget)
        self.listWidget = ListWidget(self.centralwidget)
        self.pushButton = QPushButton('Push Button', self.centralwidget)
        self.label.setSizePolicy(sizePolicy2)
        self.listWidget.setSizePolicy(sizePolicy)
        self.listWidget.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
        self.pushButton.setSizePolicy(sizePolicy1)
        self.verticalLayout.addWidget(self.label)
        self.verticalLayout.addWidget(self.listWidget)
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton.clicked.connect(self.additem)

    def additem(self):
        i = self.listWidget.count()
        self.listWidget.addItem(QListWidgetItem("Item" + str(i), type=0))


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

Python相关问答推荐

使用Keras的线性回归参数估计

Pandas 在最近的日期合并,考虑到破产

Pytest两个具有无限循环和await命令的Deliverc函数

如何让剧作家等待Python中出现特定cookie(然后返回它)?

输出中带有南的亚麻神经网络

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何列举Pandigital Prime Set

当独立的网络调用不应该互相阻塞时,'

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

让函数调用方程

人口全部乱序 - Python—Matplotlib—映射

Cython无法识别Numpy类型

计算机找不到已安装的库'

需要帮助使用Python中的Google的People API更新联系人的多个字段'

如何使用大量常量优化代码?

如何写一个polars birame到DuckDB

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

Polars时间戳同步延迟计算

删除另一个div中的特定div容器

Pandas 数据框自定义排序功能