仅将某些小部件设置为使用 window 调整大小
Set only certain widgets to resize with the window
我需要我的一些小部件随着 window 调整大小,因为用户使它变大或变小,我已经看过 this question,但不幸的是那里的所有答案都解决了通过为主要 window 分配布局来解决问题。这样做对我来说不是一个选择,因为我发现不可能使用 Qt Designer 提供的任何布局模式以我想要的方式布置小部件;换句话说,在我的例子中,布局被设置为“损坏”是设计使然。
我只有三个小部件想要响应:您可以在下面的屏幕截图中看到的两个框和顶部的大按钮。其他一切都应该留在原处。我怎样才能做到这一点?
确切地说,随着 window 的增长,我希望这两个框在垂直和水平方向上以相同的方式增长,而按钮应该只在水平方向上增长。我不需要在 ui 文件中完成此操作:代码解决方案也可以。
基本的 Qt 布局(网格和盒装)非常简单但功能强大,并且在非常罕见的特定情况下实际上需要手动覆盖几何图形;即使在这些情况下,也应该非常小心,因为需要深入了解和理解 Qt 大小管理,以避免可能导致无法使用 UI 甚至递归问题的意外行为。
99% 的时间了解布局管理器的工作方式就足够了,并花一些时间了解整个布局的结构,可能是通过使用嵌套布局并适当调整拉伸和大小策略。提示:在纸上画草图有很大帮助。
对于您的情况,可能的解决方案可以使用以下结构:
- 中央小部件的主要垂直布局
- 顶部元素的网格布局,其中:
- 标签和行在第一行编辑,每行一个单元格
- 一个垫片
- 占据网格两行的按钮
- 两个组中的每一个的垂直布局,其中:
- 标签
- 滚动区域
- 底部元素的水平布局,包括:
- 按钮
- 另一个垫片
- 复选框
然后,行编辑有一个 Preferred
水平大小策略,“立即扫描”按钮有一个最小高度和一个 Expanding
水平策略;底部的两个按钮具有相同的最小尺寸,复选框具有 Expanding
水平策略;两个滚动区域保持原样,因为它们默认会自行扩展(并且由于它们是唯一垂直扩展的小部件,因此它们将平均扩展)。所有垫片都有固定宽度(默认情况下它们是“扩展”垫片)。
请注意,虽然我可以为底部的两个“组”使用网格布局,但使用嵌套 vertical/horizontal 布局通常更灵活;在任何情况下,另一种可能的变化可能是对这两组 both 使用 separate 网格布局(因为它们具有共同的元素、大小和行为),“header”标签和滚动区域跨越 3 列。
在这里您可以看到将出现在 Designer 中的结构:
这里是 UI 文件。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>454</width>
<height>405</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Scan:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="gridSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3" rowspan="2">
<widget class="QPushButton" name="pushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="text">
<string>Scan now</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="detectVertLayout">
<item>
<widget class="QLabel" name="detectLabel">
<property name="text">
<string>Detected:</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="detectTextEdit"/>
</item>
<item>
<layout class="QHBoxLayout" name="detectBtnLayout">
<item>
<widget class="QPushButton" name="pasteButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="icon">
<iconset theme="edit-paste"/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="copyCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Copy automatically</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="translVertLayout">
<item>
<widget class="QLabel" name="translateLabel">
<property name="text">
<string>Translations:</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="translateTextEdit"/>
</item>
<item>
<layout class="QHBoxLayout" name="translBtnLayout">
<item>
<widget class="QPushButton" name="translButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Translate</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="autoTranslCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Translate automatically</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>454</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
建议您在Designer中加载以上文件,耐心研究;最重要的是,仔细查看每个元素的 overridden 属性:row/column spanning、minimum/maximum sizes、size policies 和 stretches。
然后做一些阅读:
最后,通过代码在 Designer 和 中进行大量测试和试验。
我需要我的一些小部件随着 window 调整大小,因为用户使它变大或变小,我已经看过 this question,但不幸的是那里的所有答案都解决了通过为主要 window 分配布局来解决问题。这样做对我来说不是一个选择,因为我发现不可能使用 Qt Designer 提供的任何布局模式以我想要的方式布置小部件;换句话说,在我的例子中,布局被设置为“损坏”是设计使然。
我只有三个小部件想要响应:您可以在下面的屏幕截图中看到的两个框和顶部的大按钮。其他一切都应该留在原处。我怎样才能做到这一点?
确切地说,随着 window 的增长,我希望这两个框在垂直和水平方向上以相同的方式增长,而按钮应该只在水平方向上增长。我不需要在 ui 文件中完成此操作:代码解决方案也可以。
基本的 Qt 布局(网格和盒装)非常简单但功能强大,并且在非常罕见的特定情况下实际上需要手动覆盖几何图形;即使在这些情况下,也应该非常小心,因为需要深入了解和理解 Qt 大小管理,以避免可能导致无法使用 UI 甚至递归问题的意外行为。
99% 的时间了解布局管理器的工作方式就足够了,并花一些时间了解整个布局的结构,可能是通过使用嵌套布局并适当调整拉伸和大小策略。提示:在纸上画草图有很大帮助。
对于您的情况,可能的解决方案可以使用以下结构:
- 中央小部件的主要垂直布局
- 顶部元素的网格布局,其中:
- 标签和行在第一行编辑,每行一个单元格
- 一个垫片
- 占据网格两行的按钮
- 两个组中的每一个的垂直布局,其中:
- 标签
- 滚动区域
- 底部元素的水平布局,包括:
- 按钮
- 另一个垫片
- 复选框
- 顶部元素的网格布局,其中:
然后,行编辑有一个 Preferred
水平大小策略,“立即扫描”按钮有一个最小高度和一个 Expanding
水平策略;底部的两个按钮具有相同的最小尺寸,复选框具有 Expanding
水平策略;两个滚动区域保持原样,因为它们默认会自行扩展(并且由于它们是唯一垂直扩展的小部件,因此它们将平均扩展)。所有垫片都有固定宽度(默认情况下它们是“扩展”垫片)。
请注意,虽然我可以为底部的两个“组”使用网格布局,但使用嵌套 vertical/horizontal 布局通常更灵活;在任何情况下,另一种可能的变化可能是对这两组 both 使用 separate 网格布局(因为它们具有共同的元素、大小和行为),“header”标签和滚动区域跨越 3 列。
在这里您可以看到将出现在 Designer 中的结构:
这里是 UI 文件。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>454</width>
<height>405</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Scan:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="gridSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3" rowspan="2">
<widget class="QPushButton" name="pushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="text">
<string>Scan now</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="detectVertLayout">
<item>
<widget class="QLabel" name="detectLabel">
<property name="text">
<string>Detected:</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="detectTextEdit"/>
</item>
<item>
<layout class="QHBoxLayout" name="detectBtnLayout">
<item>
<widget class="QPushButton" name="pasteButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="icon">
<iconset theme="edit-paste"/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="copyCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Copy automatically</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="translVertLayout">
<item>
<widget class="QLabel" name="translateLabel">
<property name="text">
<string>Translations:</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="translateTextEdit"/>
</item>
<item>
<layout class="QHBoxLayout" name="translBtnLayout">
<item>
<widget class="QPushButton" name="translButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Translate</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="autoTranslCheck">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Translate automatically</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>454</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
建议您在Designer中加载以上文件,耐心研究;最重要的是,仔细查看每个元素的 overridden 属性:row/column spanning、minimum/maximum sizes、size policies 和 stretches。
然后做一些阅读:
最后,通过代码在 Designer 和 中进行大量测试和试验。