Qt 记录之实时获取窗体的尺寸Geometry

前言

在进行Qt程序开发时,想在不同的地方获取主窗体QMainWindowgeometry或者frameGeometry属性。

解决方案

    1. 将主窗体设计为单例;
    1. 将主窗体指针设置到需要用到主窗体的geometry属性的对象里;
    1. 声明一个全局静态类型,当主窗体位置或者尺寸发生变化时,用于获取主窗体的geometry属性。

第一个更好实现些,创建主窗体类时,直接设计为单例,在需要的地方调用即可;
第二种显得比较冗余,不好管理对象;
第三种实现更灵活,调用也方便。

问题分析

根据QMainWindow帮助手册可知,当窗体尺寸改变时,会触发resizeEvent()事件,但是如果只在resizeEvent()事件里,获取geometry或者frameGeometry属性,当窗体初始化显示、最大化、最小化和移动位置时,获取的geometry信息是错误的。

  • 初次加载时,如下代码所示:
void MainWindow::resizeEvent(QResizeEvent *e)
{
    qDebug().noquote() << this->geometry();
    QMainWindow::resizeEvent(e);
}

初次启动程序,结果如下:
image.png
但整个窗体显示一般会在屏幕中央区域,所以说得到的geometry的信息是错误的。

  • 最大化时,输出信息:
    image.png
    很明显也不对,因为最大化,x()y()应该是(0, 0);反之,双击还原窗体尺寸,得到的geometry也是不对的。

  • 移动位置,没有打印,因为移动位置,尺寸没变化,所以不会进入resizeEvent()事件。

继续翻阅文档,发现还有changeEvent(QEvent *e)moveEvent(QMoveEvent *e)事件,当窗体改变或者移动时触发以上两个事件。
将以上三个事件结合,得到的geometry或者frameGeometry属性就是正确的。

具体示例代码

void MainWindow::resizeEvent(QResizeEvent *e)
{
    qDebug().noquote() << this->frameGeometry();
    s_frameGeometry = this->frameGeometry();
    QMainWindow::resizeEvent(e);
}

void MainWindow::changeEvent(QEvent *e)
{
    qDebug().noquote()<< this->frameGeometry();
    s_frameGeometry = this->frameGeometry();
    QMainWindow::changeEvent(e);
}

void MainWindow::moveEvent(QMoveEvent *e)
{
    qDebug().noquote()<< this->frameGeometry();
    s_frameGeometry = this->frameGeometry();
    QMainWindow::moveEvent(e);
}

当使用时,在调用的地方调用全部变量frameGeometry即可
启动程序,输出信息如下:
image.png

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中,geometry函数是一种用于管理窗口控件位置和大小的重要方法。它的函数原型是void QWidget::geometry() const; [2这个函数返回一个QRect对象,表示窗口控件的位置和大小。可以通过调用geometry函数来获取窗口的位置和大小信息。例如,可以使用window.geometry().x()来获取窗口的x坐标,window.geometry().y()来获取窗口的y坐标,window.geometry().width()来获取窗口的宽度,window.geometry().height()来获取窗口的高度。通过使用这些函数,我们可以获取和管理窗口控件的几何属性,以实现对窗口的定位和大小的控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Qt 窗口几何坐标系统: geometry,frameGeometry](https://blog.csdn.net/ken2232/article/details/129474065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt 中的 geometry 函数详解](https://blog.csdn.net/qq_46017342/article/details/130905269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FreeLikeTheWind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值