VS+Qt应用开发-Qt窗口坐标系统介绍

对于一个窗口或控件,往往要设置或获取它的位置和大小。

Qt帮助文档里的说明

在Qt的帮助文档中搜索“Window and Dialog Widgets”关键字,显示了窗口的几何示意图。
VS+Qt应用开发-Qt窗口坐标系统介绍
简单翻译:QWidget提供了几个函数用于处理窗体的几何。一部分只作用于客户区,不包含框架,一部分包含框架。

  • 包含框架的函数:x(), y(), frameGeometry(), pos(),和move().
  • 不包含框架的函数:geometry(), width(), height(), rect(),和size().


代码测试

在实际的代码测试中还是遇到了一些问题:

  • 首先,在窗口的构造函数中设置并获取上述几何尺寸;
    VS+Qt应用开发-Qt窗口坐标系统介绍
    发现geometry()和frameGeometry()获取的尺寸没有区别,貌似框架并没有对尺寸产生影响,原以为是bug,后来参考了文章https://blog.csdn.net/xiaodingqq/article/details/85794397必须要在窗口show之后才有效!!!

  • 在show之后再获取尺寸:
    VS+Qt应用开发-Qt窗口坐标系统介绍
    可以发现geometry()和frameGeometry()已经有了区别,下面在图中标注出来:
    VS+Qt应用开发-Qt窗口坐标系统介绍

  • 然后测试窗口中子控件的几何尺寸:
    VS+Qt应用开发-Qt窗口坐标系统介绍
    VS+Qt应用开发-Qt窗口坐标系统介绍
    发现在工具栏和状态栏存在时,子控件的原点并不是客户区的原点,而是需要减去工具栏的尺寸。

  • 移除工具栏和状态栏之后,代码不变:
    VS+Qt应用开发-Qt窗口坐标系统介绍
    VS+Qt应用开发-Qt窗口坐标系统介绍
    发现移除工具栏和状态栏之后,子控件的原点就是客户区的原点

  • 这一点可以在Qt Designer中发现原因:
    VS+Qt应用开发-Qt窗口坐标系统介绍
    在客户区中,工具栏、状态栏和centralWidget是并列的,也就是说这三者是客户区的一级子控件,而label是客户区的二级子控件,label的原点是在centralWidget坐标系中。所以当工具栏存在时,centralWidget的原点在客户区的坐标系中表示为(0,12),label的原点在客户区的坐标系中也表示为(0,12),并不与客户区原点重合。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-29
  • 2022-12-23
  • 2021-09-09
  • 2021-10-18
  • 2021-09-21
猜你喜欢
  • 2021-10-27
  • 2021-08-11
  • 2021-08-24
  • 2022-01-22
  • 2021-10-02
  • 2022-12-23
相关资源
相似解决方案