繁体   English   中英

PyQt5 listWidget 拒绝在 QtDesigner 中变小

[英]PyQt5 listWidget refuse to get smaller in QtDesigner

我在设计器中有一个如下所示的布局:

在此处输入图像描述

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

  1. 将 textLabel 的拉伸因子设置为 listWidget 为 1,0
  2. 将 listWidget 的 sizePolicy 以及它所在的小部件设置为最小
  3. 设置要调整的 listWidget 的 resizeMode
  4. 将按钮的 sizePolicy(我希望它填满所有剩余空间)设置为展开
  5. 将小部件到按钮的拉伸因子设置为 0,1

但这些都不起作用。 此外,尽管没有为任何东西设置最小尺寸,但 window 似乎无法变得比这更小,这让我相信 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 中的大小策略与乍一看不同。 Minimum实际上意味着尽可能多地增长。 Maximum实际上意味着尽可能地缩小。 您可以在Qt 文档中了解有关它们的更多信息

您可以做的最后一部分是覆盖 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM