我在Qt Designer中创建了一个新的QWidget
,frame
包含QLabel
和QTextEdit
。我可以设置所有这些元素的几何,并将它们设置为fixed
,以便它们的高度/宽度永远不会改变:
在此示例中,我的QLabel
和QLineEdit
位于其父框架的右上角。如果我现在设置一个布局到框架(我需要做的是确保元素在调整窗口大小时保持在正确的位置,或者如果框架是QScrollArea
的主要窗口小部件),则移动元素,甚至在框架的参考范围内:
在这种情况下,表格布局应用于框架;我们可以看到QLabel
的(X,Y)坐标从(0,0)变为(10,10)。无论我是否预先将两个元素包装在垂直框架中,都会发生这种情况。
鉴于我试图通过手动设置元素坐标来创建一个非常精确的布局,让它们在应用布局时移动看似随机的数量是非常令人沮丧的。我该怎么办?!我以为我误解了什么,但我不知道是什么!
答案 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)
影响您需要注意的定位和尺寸的关键因素是:
所有元素以级联方式协同工作。通常需要花费大量的试验和CTRL + R来评估外观并调整表单的大小,但通常是这3件事。