QT布局之QGridLayout嵌套QHBoxLayout

news2024/12/28 18:25:11

搞嵌入式系统开发的,往往都是真全栈开发者。从硬件到驱动到操作系统到应用以及功能界面,是哪里需要搞哪里。这不,最近需要开发一个基于QT的界面功能,涉及到控件布局。因为不熟悉,走了一些弯路。这里将相关调试记录下来,方便以后参考。

多说一点。早些年不喜欢做UI,觉得体现不了水平,后来工作中涉及到相关开发后,发现界面也不是那么容易的。首先逻辑思维是第一关。业务代码不像系统代码那样,经过长时间的沉淀,功能需求都比较清晰。往往是各种需求一个接一个,前面这样设计了,后面又要因为新的功能,打破之前的流程,最终导致面条式的代码,揉在一起。因此,在最开始功能框架的设计时,好的抽象能力就显得特别特别重要,而且也是能力的一大考验。像QT的信号槽机制,Android的Activity组件机制,都是这类的典型代表。

其次,很多时候,界面不是独立的,往往都要嵌入到现成的框架中。比如QT也罢,Android也罢,早期的MFC也罢,都需要开发者对所依赖的框架有比较好的掌握。这样才能对各种控件的特性和结合有比较好的掌握,才能高效的写出高性能、稳定的界面应用来。笔者之前曾经做过一个Android下的视频会议应用。这个应用,有多个视频窗口,每个视频窗口里又独立的包含多个功能,还包括一些动态参量的刷新,比如音量。另外还嵌入了地图,地图上又可以浮动视频窗。按照Android的标准组件,一个嵌套一个的方法来设计,最终跑起来,发现能明显感觉到切换过程。打开Android自带的优化工具,可以看到分析出来的组件树十分的庞杂。这时候的优化,就看对Android自身界面设计思想的理解程度了。

回到主题。主要是这样一个需求:提供一个浮动框,里面展示设备状态,并添加几个控制按钮,根据状态实现一些快捷操作。

最开始考虑使用GridLayout做大的布局。将整体分为多行多列。逻辑上如下图:

 

完成后,根据布局要求,有几个小的调整地方。就是这几个调整地方,花了不少时间。

1 状态展示部分是三列的,按钮只有两个,想让按钮平分整个宽度,也就是一个按钮占用一个半列。如下图所示:

 

可以直接在GridLayout里嵌QHBoxLayout。QHBoxLayout是水平布局框,控件会在布局中一个一个从左到右排列。示例代码如下:

    <layout class="QHBoxLayout" name="control">
      <property name="leftMargin">
       <number>1</number>
      </property>
      <property name="rightMargin">
       <number>1</number>
      </property>
      <item row="0" column="0" rowspan="2">
       <widget class="QPushButton" name="test1">
        <property name="text">
         <string>     测试1</string>
        </property>
       </widget>
      </item>
      <item row="0" column="1" rowspan="2">
       <widget class="QPushButton" name="test2">
        <property name="text">
         <string>     测试2</string>
        </property>
       </widget>
      </item>
    </layout>

其中,我们将colspan=”3”,这样控件水平占据三个控件格宽度(上一级的GridLayout),但实际只布局了两个。

2 解决了宽度问题后发现按钮相比状态控件,显得过小。这就导致按钮不容易被点击触摸到。于是就衍生一个新需求,即如何调整按钮的高度。

这就需要借助rowstretch和rowspan两个属性了。第一个是放在上一级,也就是父一级的布局中的,第二个是放在当前子布局中的。

第一个属性说明了伸缩因子。值越大,对应item(从0开始)控件的可调整范围就越大。第二个是说在行方向上,占据几个单位大小。这里设定为2,结合伸缩因子,就可以把嵌入的按钮缩放到更大的范围。示例代码如下:

<layout class="QGridLayout" name="gridLayout" rowstretch="5,3,3,3,8" columnstretch="1,20,20"></layout>
...
<item row="4" column="0" colspan="3" rowspan="2">
    <layout class="QHBoxLayout" name="control">
      <property name="leftMargin">
       <number>1</number>
      </property>
      <property name="rightMargin">
       <number>1</number>
      </property>
      <item row="0" column="0" rowspan="2">
       <widget class="QPushButton" name="test1">
        <property name="text">
         <string>     测试1</string>
        </property>
       </widget>
      </item>
      <item row="0" column="1" rowspan="2">
       <widget class="QPushButton" name="test2">
        <property name="text">
         <string>     测试2</string>
        </property>
       </widget>
      </item>
    </layout>
   </item>
</layout>

补充一点,控件布局是可用嵌套的,比如QGridLayout可用在某一个子项中嵌套一个新的QGridLayout,这样就可以实现更加复杂的布局。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络面试题【面试】

计算机网络面试题前言OSI 七层网络模型应用层表示层会话层传输层网络层数据链路层物理七层总结输入URL后会发生什么1. DNS域名解析2. 三次握手建立TCP连接3. 发送HTTP网络请求4. 服务器处理请求5. 服务器返回响应6. 四次挥手断开TCP连接7. 解析HTMLDNS解析过程DNS解析&#xff…

Froala Editor JavaScript WYSIWYG HTML 编辑器

Froala Editor JavaScript WYSIWYG HTML 多用途、易于使用的 WYSIWYG 编辑器&#xff0c;优雅 每次点击&#xff0c;我们都会让网络编辑变得更简单、更强大、更愉快 安全、快速、智能和稳健。 Froala Editor 是一个 用 JavaScript 编写 的轻量级 WYSIWYG HTML 编辑器&#xff0…

【计算机毕业设计】小型OA系统设计与实现Springboot

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括小型OA系统设计与实现的网络应用&#xff0c;在国外小型OA系统设计与实现已经是很普遍的方式&#xff0c;不…

G1D17-研究方向rce45-49不快乐就去敲敲代码

现在每天晚上都觉得一天结束的好快呀~每天早上都很幸福&#xff0c;因为还有一天的时间呐&#xff01;&#xff01;&#xff01; 今天主要的事情是完成老师的作业——论文主题阅读的report&#xff0c;看一下动态规划&#xff08;emm最近喜欢啃这种让人掉头发的问题~&#xff0…

JADE: Adaptive Differential Evolution withOptional External Archive

0、论文背景 本文在DE的基础上&#xff0c;提出了一种新的差分进化(DE)算法JADE&#xff0c;通过实现一种新的突变策略DE/current-to-pbest&#xff0c;采用可选的外部存档和参数的自适应更新&#xff0c;来提高优化性能。上述两种操作使种群多样化&#xff0c;并提高了收敛性…

Mybatis源码解析(六):缓存执行器操作流程

Mybatis源码系列文章 手写源码&#xff08;了解源码整体流程及重要组件&#xff09; Mybatis源码解析(一)&#xff1a;环境搭建 Mybatis源码解析(二)&#xff1a;全局配置文件的解析 Mybatis源码解析(三)&#xff1a;映射配置文件的解析 Mybatis源码解析(四)&#xff1a;s…

【附源码】Python计算机毕业设计图书共享系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Bootstrap(三)

目录&#xff1a; &#xff08;1&#xff09;bootstrap响应式工具 &#xff08;2&#xff09;bootstrap实例导航 &#xff08;1&#xff09;bootstrap响应式工具 class加属性&#xff1a; visible-xs&#xff1a;隐藏显示&#xff0c;当屏幕宽度小于等于xs的时候显示、 vis…

如何使用轻量应用服务器搭建Typecho个人博客系统?

之前有写过WordPress搭建博客的教程&#xff1a;如何使用轻量应用服务器搭建WordPress个人博客 有的小伙伴感觉WordPress比较臃肿&#xff0c;有没有比较简洁的博客系统呢&#xff0c;今天就把Typecho搭建个人博客的操作方法分享给大家&#xff0c;需要的小伙伴可以参考以下。 …

注解的使用

1. 注解概述 1.1 注解概述、作用 Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。 1.2 注解的作用是什么 2. 自定义注解 2.1 自定义注解 —…

大数据之Hive基本查询

文章目录前言一、Hive基本查询&#xff08;一&#xff09;普通查询&#xff08;二&#xff09;Join查询&#xff08;三&#xff09;排序查询总结前言 #博学谷IT学习技术支持# 这一次主要介绍Hive的基本查询以及相关函数&#xff0c;Hive的查询以及函数用法与MySQL不尽相同&…

自动化立体仓库系统实训

实训目的 理解被控对象&#xff0c;控制系统关系&#xff1b;逻辑流程任务综合训练&#xff1b;仓储智能管理实现&#xff1b;工业系统整体调试&#xff1b; 实训设备 虚拟仿真被控对象&#xff1b;S7-300控制器及实验台接口&#xff1b;DAQ信号板卡及继电器模块&#xff1b; 设…

基于划分的方法、K-均值算法、K-medoids、K-prototype(机器学习)

目录 基于划分的方法 K-均值算法 k-均值算法聚类步骤如下&#xff1a; K-均值算法优缺点 K-medoids算法 K-prototype算法 基于划分的方法 1、基于划分的方法是简单、常用的一种聚类方法&#xff1b; 2、通过将对象划分为互斥的簇进行聚类&#xff0c; 每个对象属于且仅属…

Python学习基础笔记九——集合

集合&#xff1a;可变的数据结构&#xff0c;元素必须是不可变的数据类型&#xff0c;无序&#xff0c;不重复&#xff08;去重&#xff09;。 数据集的方法&#xff1a; 方法功能S.add(tom)增加一个元素S.update(abc)增加一个可迭代元素&#xff0c;每个元素都分别添加进去S.…

[附源码]java毕业设计网上博物馆设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《计算机视觉技术与应用》-----第五章 边缘和轮廓

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

【人工智能】MindSpore Hub

目录 前言 一、什么是MindSpore Hub 1.简单介绍 2.MindSpore Hub包含功能 3.MindSpore Hub使用场景 二、安装MindSpore Hub 1.确认系统环境信息 2.安装 3.下载源码 4.进行验证 三、加载模型 1.介绍 2.推理验证 3.迁移学习 四、模型发布 前言 MindSpore着重提升易…

营造激发自驱力注重培养学习力的想法一

目录背景过程第一节&#xff1a;第二节&#xff1a;第三节&#xff1a;总结升华背景 小编做的是教育类公司&#xff0c;其实无论是做公司的产品&#xff0c;还是对于公司团队人员的培养&#xff0c;都需要去思考教育这件事&#xff0c;尤其是激发自驱力培养学习力&#xff1b;…

常用的框架07-消息中间件-RabbitMQ

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1.消息中间件概述1.1 为什么学习消息队列1.2 什么是消息中间件1.3 消息队列应用场景1.3.1 异步处理1.3.2 应用程序解耦合1.3.3 削峰填谷1.3.4 什么是QPS1.3.5 什么是…

servlet和vue的增删改查

1.servlet实现步骤 Servlet->新增 servlet获取请求参数&#xff0c;将参数转化为对象&#xff0c;调用service WebServlet("/addService") public class addAllService extends HttpServlet {private BrandService brandService new BrandServiceimpl() ;Over…