如何在 QML 中设计多层流体布局

2024-01-15

我在 QML 中设计了一个布局,以了解有关其功能的更多信息,并对设计此类布局的“最佳实践”有一些疑问。这里是:

它本质上是一个列布局由三个组成行布局s,每一个都有一些长方形s。每行和矩形的大小应计算如下:

  • First row: Height = 40%, Width = 100%
    • 红色矩形填充整个区域
  • Second row: Height = 20%, Width = 100%
    • 深绿色矩形:高度 = 100%,宽度 = 20%,
    • 浅绿色矩形:高度 = 100%,宽度 = 80%
  • Third row: Height = 40%, Width = 100%
    • 深蓝色矩形:高度 = 100%,宽度 = 40%,
    • 蓝色矩形:高度 = 100%,宽度 = 20%
    • 浅蓝色矩形:高度 = 100%,宽度 = 40%

我提出的 QML 正在运行,如下所示。我对此有一些疑问:

  1. 我已经使用设置了宽度和高度百分比Layout.preferredHeight: x*parent.height图案。其他选项导致了一些问题(例如,preferredHeight 导致绑定循环警告)。我的方法正确且有效吗?
  2. 作为一名黑客,我设置了布局.fillWidth: true对于第 2 行和第 3 行的第一个元素,这对我来说没有意义,但确实有效。如果我将它们的宽度设置为百分比(例如布局.preferredWidth: 0.2*parent.width)他们的行将折叠到宽度 0。这是预期的行为吗?有没有更好的解决方法?
  3. 您对布局有什么建议吗?我走在正确的道路上吗?

这是我的布局 QML 代码:

ApplicationWindow {
    x: 500
    y: 100
    width: 250
    height: 150
    visible: true

    ColumnLayout {
        anchors.fill: parent
        spacing: 0
        RowLayout {
            spacing: 0
            Layout.preferredHeight: 0.4*parent.height
            Layout.fillHeight: false
            Rectangle {
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "red"
            }
        }
        RowLayout {
            spacing: 0
            Layout.preferredHeight: 0.2*parent.height
            Layout.fillHeight: false
            Rectangle {
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "darkGreen"
            }
            Rectangle {
                Layout.fillHeight: true
                Layout.preferredWidth: 0.8*parent.width
                color: "lightGreen"
            }
        }
        RowLayout {
            spacing: 0
            Layout.preferredHeight: 0.4*parent.height
            Layout.fillHeight: false
            Rectangle {
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "darkBlue"
            }
            Rectangle {
                Layout.fillHeight: true
                Layout.preferredWidth: 0.2*parent.width
                color: "blue"
            }
            Rectangle {
                Layout.fillHeight: true
                Layout.preferredWidth: 0.4*parent.width
                color: "lightBlue"
            }
        }
    }
}

Update:

我的方法似乎比我预期的更老套:

  1. Putting Text元素作为此布局中的子元素引发结合环警告如:

QML QQuickLayoutAttached:检测到属性“preferredWidth”的绑定循环

如果将 Text 包裹在长方形警告消失。

  1. The 间距:0似乎发挥着重要作用。省略它会导致绑定循环警告。

虽然我在 QML 中进行流体布局设计的方法有效,但它存在一些严重的问题,并且可能不属于“最佳实践”。


虽然其他两个答案都显示了有效的解决方案,但我相信所提出的问题和两个解决方案都在某种程度上错过了使用布局的要点。

基本上,布局是为了将具有隐式大小(implicitHeight/implicitWidth)的项目组合在一起。 Layout.preferredWidth/Layout.preferredHeight 用于在极少数情况下覆盖这些内容,请参见下文。 Qt 附带的“Qt 快速布局 - 基本示例”根本不使用 Layout.preferredWidth/Layout.preferredHeight(!),并且外观非常漂亮,不会用锚点或布局属性污染整个 qml 文件。自己需要一些学习才能做到这一点,但是一旦习惯了,布局就是一种用更少的代码更直接地定义用户界面的方法。

一开始最让我困惑的是以下几件事:

  • RowLayout/ColumnLayout/GridLayout 的 Layout.fillWidth/Layout.fillHeight 设置为 true,因此当将它们放在 Item/矩形附近时,Item/矩形会突然消失,因为它们没有设置这些值(即它们有 Layout. fillWidth/Layout.fillHeight 设置为 false)。
  • 项目/矩形的隐式高度/隐式宽度为 0,这意味着它们与布局并排运行效果不佳。最好的办法是从包含的子项中派生隐式宽度/隐式高度,就像 RowLayout/ColumnLayout 本身默认为其子项所做的那样。
  • Layout.preferredWidth/Layout.preferredHeight 可用于克服已定义且无法设置的隐式尺寸。其中一个位置直接位于布局项中,另一个位置例如是一个文本项,它也不允许您覆盖隐式大小。

考虑到这些点,我将按以下方式编写示例。我删除了不必要的项目,以更好地说明何时需要 Layout.fillwidth/Layout.fillheight,以及我认为何时使用隐式宽度更好。

import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    width: 250
    height: 150
    visible: true

    ColumnLayout {
        spacing: 0
        anchors.fill: parent
        Rectangle {
            implicitHeight: 40
            Layout.fillHeight: true
            Layout.fillWidth: true
            color: "red"
        }
        RowLayout {
            spacing: 0
            Layout.preferredHeight: 20
            Rectangle {
                implicitWidth: 20
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "darkGreen"
            }
            Rectangle {
                implicitWidth: 80
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "lightGreen"
            }
        }
        RowLayout {
            spacing: 0
            Layout.preferredHeight: 40
            Rectangle {
                implicitWidth: 40
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "darkBlue"
            }
            Rectangle {
                implicitWidth: 20
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "blue"
            }
            Rectangle {
                implicitWidth: 40
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: "lightBlue"
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 QML 中设计多层流体布局 的相关文章

  • 使用 jQuery Mobile 和响应式布局/CSS 媒体查询是否多余?

    我正在退房http mediaqueri es http mediaqueri es 今天发现这些网站非常适合移动设备 所以我想知道将 jQuery Mobile 和响应 自适应布局与媒体查询一起使用是否是多余的 因为仅使用媒体查询似乎是一
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 新BFC“清”浮箱

    如示例所示 应用display inline block 到包含块似乎 清除 了其中的浮动框 wrapper inline block display inline block left column background color te
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod

随机推荐

  • 如何强制 where 子句中的函数在 oracle 中执行一次?

    我正在尝试根据 IP 地址查询相当大的 IP 城市 3 000 000 多行 表 我的源 IP 地址是点分符号 例如 127 0 0 1 表有两个字段存储为整数 例如 2130706433 因此 我需要将点分符号转换为我的 where 子句
  • ASP.NET MVC 3 远程验证以允许原始值

    我的用户模型的电子邮件属性上有一个远程属性 当我创建新用户时 它会创建并告诉用户电子邮件已在使用中 现在我的编辑表单遇到问题 如果用户想要更新值 它告诉用户他 她的电子邮件已在使用中 当正在使用的电子邮件是用户注册的电子邮件时 我不希望它给
  • 奇怪的段错误,可能与 realloc 有关

    char dumpTB TB tb char text malloc sizeof char int i 0 int x 0 string index tNode curr tb gt head while curr NULL while
  • 何时使用 Task.Run().GetAwaiter().GetResult() 和 ().GetAwaiter.GetResult()? [复制]

    这个问题在这里已经有答案了 我有一个需要同步调用的异步任务 是的 不幸的是 这是不可避免的 似乎有两种方法可以实现这一点 每种方法似乎都有效 所以我不确定哪种方法是最好的方法 或者是否有更好的方法 例如 var meetings Task
  • Pig 本地模式、组或 join = java.lang.OutOfMemoryError: Java 堆空间

    Using Apache Pig 版本 0 10 1 21 报道 CentOS 版本 6 3 最终版 jdk1 6 0 31 Virtualbox 上的 Hortonworks Sandbox v1 2 具有 3 5 GB RAM cat
  • OCaml 中的函子

    我在函子 及其结果类型 方面遇到了一些问题 下面 我有一个Set使用一个函子Ordered类型 我实际上使用了set mlOCaml 附带提供一些指导 但我似乎正在做所有事情ahem正确的 我创建了一个Ordered模块与整数并将其应用到S
  • VBA:为什么人们在“Next”语句中包含变量的名称?

    我总是这样写我的 For 循环 For foo 1 to 10 do something Next 然而 当我在网上阅读代码片段时 人们总是这样做 For foo 1 to 10 do something Next foo 我没有注意到两者
  • SSIS 脚本编辑器加载速度非常慢

    在我的角色中 我偶尔会使用 SSIS 在我最新的包中 我使用了脚本任务 我的机器速度足够快 运行 64 位并且有大量内存 但每当我尝试编辑脚本时 我必须等待近一分钟才能加载代码 我正在使用 VS 2012 和 SQL 2012 任何想法 不
  • 在 Redshift 外部表中引用转义引号

    我正在尝试从 csv 中创建一个 Redshift 外部表 其中包含转义引号 如中所述rfc4180 https www rfc editor org rfc rfc4180 如果使用双引号将字段括起来 则使用双引号 出现在字段内的内容必须
  • Python - sys.stderr 未保存到 .txt 或 .log

    我正在检查标准流的工作情况 目前我正在使用stderr使用Python 为了解释清楚 以下是我的代码 print Python testt 当我运行代码时 我得到以下信息 Python Traceback most recent call
  • 如何将 ASP.NET Core 应用程序发布到 ftp 服务器

    Visual Studio发布仅支持导入Web部署 有解决方法吗 Visual Studio 发布配置文件支持纯 FTP 作为目标 但它不支持 SFTP 您应该看到以下选项 网络部署 网络部署包 FTP 不幸的是不支持SFTP 文件系统 U
  • 静态常量变量在子类中不是常量

    我使用的是 Visual Studio 2008 有两个类 Parent 和 Child Parent在头文件中声明了一些静态const变量 然后在cpp文件中定义这些变量 当我尝试在子类的 switch 语句中使用定义作为 case 时
  • Visual Studio 2012 条件捆绑

    我刚刚开始使用 VS 2012 RC 我创建了一个带有母版页和单个 Web 表单的测试站点 目前 我正在使用此代码来捆绑整个Styles网站上的文件夹 全局 asax BundleTable Bundles EnableDefaultBun
  • 如何使用 CoffeeScript 存在运算符来检查某些对象属性是否未定义?

    我想使用 CoffeeScript 存在运算符来检查某些对象属性是否未定义 然而 我遇到了一个小问题 代码如下 console log test if test 编译为 if typeof test undefined test null
  • 为什么C#不允许运算符重载?

    为什么 C 不允许运算符重载 而 C 却允许 尝试超载时出现此错误 预期可重载二元运算符 我的示例代码看起来像 public static MyClass operator MyClass obj1 MyClass obj2 您可以在 C
  • 在 rmarkdown html 输出中添加 X-UA-Compatible

    我正在尝试添加以下标签 as the first一后
  • 如何在动画之后将更改应用到视图位置?

    我将 TranslateAnimation 应用于带有 FillAfter true 的 EditText 以保持其在动画末尾的位置 动画工作正常 但问题是我无法再输入编辑文本 我认为这是因为动画仅影响渲染而不修改实际的视图坐标 是否有可能
  • 删除Linux上的终端输出

    我正在编写一个命令行程序 它将有一个状态栏 很像 wget 我面临的主要问题是 如何删除已经发送到 stdout stderr 的内容 我有一个想法 使用退格字符 b 并删除我发送的输出 这是最好的方法吗 这是唯一的方法吗 有没有更好的办法
  • 在 Objective-c 中,如何创建一个可供所有子类访问但不能公开访问的方法

    假设我创建了一个 viewController 然后我想创建另一个类似于第一个视图控制器 看起来像是一份继承的工作 然而 原始ViewController的许多任务都是私有方法 我想最小化公共接口 如果我将这些方法声明为公开的话 那么就达不
  • 如何在 QML 中设计多层流体布局

    我在 QML 中设计了一个布局 以了解有关其功能的更多信息 并对设计此类布局的 最佳实践 有一些疑问 这里是 它本质上是一个列布局由三个组成行布局s 每一个都有一些长方形s 每行和矩形的大小应计算如下 First row Height 40