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

📅 2026/7/5 14:08:45
【Qt】控件(二) (geometry及与frameGeometry的区别)
geometry位置和尺寸其实是四个属性的统称 x 横坐标,y 纵坐标, width 宽度, height 高度.注意x,y 表示“矩形左上角的位置”但是实际开发中我们并不会直接使用这几个属性而是通过一系列封装的方法来获取/修改。对于Qt的坐标系不要忘记是一个“左手坐标系”。其中坐标系的原点是当前元素的父元素的左上角。代码示例1: 控制按钮的位置1.在界面中拖五个按钮。五个按钮的objectName分别为pushButton_targetpushButton_uppushButton_downpushButton_leftpushButton_right五个按钮的初始位置和大小都随意。2.在widget.cpp中编写四个按钮的slot函数运行程序可以看到按下下方的四个按钮就会控制target的左上角的位置对应的按钮整体尺寸也会发生改变。上述代码中我们是直接设置的QRect中的x、y。实际上QRect内部存储了左上和右下两个点的坐标再通过这两个点的坐标差值计算长宽。单纯修改左上坐标就会引起整个矩形的长宽发生改变。如果想让整个按钮都移动,可以改成下列代码:代码示例2一个询问程序往界面上拖拽两个按钮和一个Label。两个按钮的objectName分别为pushButton_accept 和 pushButton_rejectlabel的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 不是一个独立窗口没有系统窗口边框所以这两个值完全一样。