Qt Designer布局不遵循预定义的几何体

时间:2014-03-06 16:59:24

标签: python layout pyqt qt-designer

我在Qt Designer中创建了一个新的QWidgetframe包含QLabelQTextEdit。我可以设置所有这些元素的几何,并将它们设置为fixed,以便它们的高度/宽度永远不会改变:

enter image description here

在此示例中,我的QLabelQLineEdit位于其父框架的右上角。如果我现在设置一个布局到框架(我需要做的是确保元素在调整窗口大小时保持在正确的位置,或者如果框架是QScrollArea的主要窗口小部件),则移动元素,甚至在框架的参考范围内:

enter image description here

在这种情况下,表格布局应用于框架;我们可以看到QLabel的(X,Y)坐标从(0,0)变为(10,10)。无论我是否预先将两个元素包装在垂直框架中,都会发生这种情况。

鉴于我试图通过手动设置元素坐标来创建一个非常精确的布局,让它们在应用布局时移动看似随机的数量是非常令人沮丧的。我该怎么办?!我以为我误解了什么,但我不知道是什么!

3 个答案:

答案 0 :(得分:1)

布局具有默认边距和间距,其精确值由当前窗口小部件样式提供。

您可以通过单击布局的父窗口小部件来覆盖默认设置,然后向下滚动到属性编辑器的底部,您将在其中看到包含相关值的布局部分(-1表示“使用”默认的“)。

修改

我没有说清楚的一点是,每次中断和重置布局时,布局边距和间距都将恢复为默认值!这有时会非常烦人,但确实有意义,因为每次执行此操作时都会创建一个新布局。

无论如何,我认为问题的真正根源实际上是你使用的是表单布局,它的灵活性远远低于其他布局。我认为你应该做的是将标签和行编辑放在水平布局中,最后是水平间隔。然后在水平布局下方放置一个垂直间隔,并向框架添加垂直布局。这种安排将使标签和行编辑保持在框架的左上角。有了这些,您最终可以将垂直布局边距设置为零以获得所需的结果。

这是一个.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>316</width>
    <height>150</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QFrame" name="frame">
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Raised</enum>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout">
      <property name="spacing">
       <number>0</number>
      </property>
      <property name="margin">
       <number>0</number>
      </property>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout">
        <property name="spacing">
         <number>0</number>
        </property>
        <item>
         <widget class="QLabel" name="label">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="minimumSize">
           <size>
            <width>75</width>
            <height>0</height>
           </size>
          </property>
          <property name="text">
           <string>TextLabel</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QLineEdit" name="lineEdit">
          <property name="sizePolicy">
           <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
            <horstretch>0</horstretch>
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
          <property name="minimumSize">
           <size>
            <width>100</width>
            <height>0</height>
           </size>
          </property>
         </widget>
        </item>
        <item>
         <spacer name="horizontalSpacer">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>40</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
       </layout>
      </item>
      <item>
       <spacer name="verticalSpacer">
        <property name="orientation">
         <enum>Qt::Vertical</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>20</width>
          <height>106</height>
         </size>
        </property>
       </spacer>
      </item>
     </layout>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

答案 1 :(得分:0)

布局的关键是它们控制元素的大小和位置。这就是他们的工作方式。如果他们无法控制窗口小部件几何体,那么在调整大小时它们会做什么?

不要试图严格控制所有内容的大小和位置,而是使用布局来传达设计意图:这两个控件属于一起,这些相同的项应该在一列中,依此类推。

答案 2 :(得分:0)

影响您需要注意的定位和尺寸的关键因素是:

  1. 基本表单的布局
  2. 表单中的布局
  3. widget sizepolicy和widget min和max size values
  4. 所有元素以级联方式协同工作。通常需要花费大量的试验和CTRL + R来评估外观并调整表单的大小,但通常是这3件事。