当前位置: 首页 > news >正文

【Qt】控件(二) (geometry及与frameGeometry的区别)

geometry

位置和尺寸,其实是四个属性的统称: x 横坐标,y 纵坐标, width 宽度, height 高度.(注意x,y 表示“矩形左上角的位置”!!!)

但是实际开发中,我们并不会直接使用这几个属性,而是通过一系列封装的方法来获取/修改。
对于Qt的坐标系,不要忘记是一个“左手坐标系”。其中坐标系的原点是当前元素的父元素的左上角。


代码示例1: 控制按钮的位置
1.在界面中拖五个按钮。
五个按钮的objectName分别为pushButton_target,pushButton_up,pushButton_down,pushButton_left,pushButton_right
五个按钮的初始位置和大小都随意。

2.在widget.cpp中编写四个按钮的slot函数

运行程序,可以看到,按下下方的四个按钮,就会控制target的左上角的位置,对应的按钮整体尺寸也会发生改变。
上述代码中我们是直接设置的QRect中的x、y。实际上QRect内部存储了左上和右下两个点的坐标,再通过这两个点的坐标差值计算长宽。
单纯修改左上坐标就会引起整个矩形的长宽发生改变。
如果想让整个按钮都移动,可以改成下列代码:

代码示例2:一个询问程序

  1. 往界面上拖拽两个按钮和一个Label。
    两个按钮的objectName分别为pushButton_accept 和 pushButton_reject,label的objectName为label
    控件中文本如下图所示:

    2.在widget.cpp中添加slot函数:

    运行程序,可以看到,当点击"挂!"时,按钮就跑了。
    将reject的槽函数触发事件改为pressed时,鼠标按下按钮就会跑,还可以改mouseMoveEvent,只要鼠标移动过来按钮就跑了。

对应的代码更麻烦一些(需要自定义类继承自QPushButton,重写mouseMoveEvent方法)。此处暂时不展开。

window frame的影响
如果 widget 作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的时候就有两种算法:包含 window frame 和不包含 .
其中 x(),y(),frameGeometry(),pos(),move() 都是按照包含 window frame 的方式来计算的。
而 geometry(),width(),height(),rect(),size() 则是按照不包含 window frame 的方式来计算的。
当然,如果一个不是作为窗口的 widget,上述两类方式得到的结果是一致的。

相关API


认真观察上面的表格,可以看到,其实这里的API有frameGeometry和geometry两个就足够完成所有的需求了。
代码示例3:感受geometry和frameGeometry的区别。
1.在界面上放置一个按钮。
2.在按钮的slot函数中,编写代码
3)在构造函数中,也添加同样的代码

执行程序,可以看到,构造函数中,打印出的geometry和frameGeometry是相同的。
但是在点击按钮时,打印的geometry和frameGeometry则存在差异。

注意:
在构造方法中,Widget刚刚创建出来,还没有加入到对象树中,此时也就不具备Window frame。
在按钮的slot函数中,由于用户点击的时候,对象树已经构造好了,此时Widget已经具备了Window frame,因此在位置和尺寸上均出现了差异。
如果把上述代码修改成打印pushButton的geometry和frameGeometry,因为 pushButton 不是一个独立窗口,没有系统窗口边框,所以这两个值完全一样。

http://www.jsqmd.com/news/1128698/

相关文章:

  • B. Good times Good times(Codeforces 2241)
  • 51单片机电冰箱保护器
  • 独立站搭建工具测评:BBWEYY/比文云/Prismic/Vercel/Supabase(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 英语单词测试
  • 2026最新AI大模型零基础入门学习计划|小白程序员专属,从理论到实战直通高薪
  • 从零开始学AI:2周上手,半年做项目,1年工程落地(收藏版)
  • 训练框架实战——FSDP vs DeepSpeed,选框架不是选最好的
  • Audacity音频编辑完全指南:从零开始制作专业音频的免费方案
  • 【共创季稿事节】记事本应用开发:ArkTS 中编辑模式切换与文本处理
  • Kimi LeetCode 3464. 正方形上的点之间的最大距离 Java实现
  • 数据产业服务分类(29)——数据产业——数字经济与数据产业
  • AI 文档助手知识库:先清理旧文档,再接检索
  • 如何用ChanlunX缠论插件3分钟完成专业股票技术分析
  • 常见排序算法详解
  • RustFS保姆级教程:Docker快速部署兼容S3的本地对象存储
  • Git仓库的打包与还原 - bundle相关命令介绍
  • 别再熬夜肝论文了!2026年5款AI写论文软件实测对比,第3款真香
  • 全套 MacBook 必调设置,瞬间适配私人Mac,上手教程分享
  • 【LE Audio】CSIP精讲[5]: 蓝牙协同设备组的安全防护体系与实战规范
  • 土木工程人必备的计算工具箱,免费无广告,大幅提升工作效率
  • GRC与渗透测试协同:构建动态有效安全防御体系
  • 教培机构小程序搭建工具测评:餐宝盈/BBWEYY/比文云/Notion Sites/Carrd(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • pytest中文教程:从入门到实战的自动化测试框架指南
  • Kimi LeetCode 3464. 正方形上的点之间的最大距离 Rust实现
  • 无需复杂设置!这款会议APP一键录音不漏关键内容
  • HarmonyOS ArkTS 实战:实现一个校园食堂排队取餐记录应用
  • VLC Android电视版专业配置手册:解锁大屏媒体中心的终极潜力
  • RAG的“语义相似≠真正相关”陷阱:从向量检索到图RAG的架构演进
  • Java面向对象课程设计:学生成绩管理系统
  • Python的struct,把C语言那套二进制魔法,一把塞进你的字符串