【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 不是一个独立窗口,没有系统窗口边框,所以这两个值完全一样。

相关推荐
c2385636 分钟前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
moonsims1 小时前
星闪在跨域无人化系统作用
开发语言·php
Iruoyaoxh2 小时前
栈和队列~
java·开发语言
Hrain-AI2 小时前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin
wdfk_prog3 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1233 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
slandarer3 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图
mct1233 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
Marst Code5 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
ZJH__GO5 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络