VS+Qt应用开发-Qt窗口坐标系统介绍
对于一个窗口或控件,往往要设置或获取它的位置和大小。
Qt帮助文档里的说明
在Qt的帮助文档中搜索“Window and Dialog Widgets”关键字,显示了窗口的几何示意图。
简单翻译:QWidget提供了几个函数用于处理窗体的几何。一部分只作用于客户区,不包含框架,一部分包含框架。
- 包含框架的函数:x(), y(), frameGeometry(), pos(),和move().
- 不包含框架的函数:geometry(), width(), height(), rect(),和size().
代码测试
在实际的代码测试中还是遇到了一些问题:
-
首先,在窗口的构造函数中设置并获取上述几何尺寸;
发现geometry()和frameGeometry()获取的尺寸没有区别,貌似框架并没有对尺寸产生影响,原以为是bug,后来参考了文章https://blog.csdn.net/xiaodingqq/article/details/85794397,必须要在窗口show之后才有效!!! -
在show之后再获取尺寸:
可以发现geometry()和frameGeometry()已经有了区别,下面在图中标注出来: -
然后测试窗口中子控件的几何尺寸:
发现在工具栏和状态栏存在时,子控件的原点并不是客户区的原点,而是需要减去工具栏的尺寸。 -
移除工具栏和状态栏之后,代码不变:
发现移除工具栏和状态栏之后,子控件的原点就是客户区的原点。 -
这一点可以在Qt Designer中发现原因:
在客户区中,工具栏、状态栏和centralWidget是并列的,也就是说这三者是客户区的一级子控件,而label是客户区的二级子控件,label的原点是在centralWidget坐标系中。所以当工具栏存在时,centralWidget的原点在客户区的坐标系中表示为(0,12),label的原点在客户区的坐标系中也表示为(0,12),并不与客户区原点重合。