QWidget Geometry 保存与恢复

2024-05-03 05:08
文章标签 恢复 保存 geometry qwidget

本文主要是介绍QWidget Geometry 保存与恢复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QWidget Geometry 保存与恢复

保存到bytearray时用 saveGeometry,从bytearray中恢复时用 restoreGeometry。

那么 saveGeometry 是究竟保存了什么?恢复时又执行了什么操作呢。

Geometry

QWidget 中与获取 geometry 有关的函数有3个(manual中只介绍了前两个,而保存和恢复时用的是后两个):

  • geometry
inline const QRect &QWidget::geometry() const 
{ return data->crect; }

其中 data 是其 QWidgetData 成员

  • frameGeometry
QRect QWidget::frameGeometry() const 
{
 Q_D(const QWidget);
 if (isWindow() && ! (windowType() == Qt::Popup)) {
   QRect fs = d->frameStrut();
   return QRect(data->crect.x() - fs.left(),
                data->crect.y() - fs.top(),
                data->crect.width() + fs.left() + fs.right(),
                data->crect.height() + fs.top() + fs.bottom());
 }
 return data->crect; 
}
  • normalGeometry
QRect QWidget::normalGeometry() const 
{
 Q_D(const QWidget);
 if (!d->extra || !d->extra->topextra)
   return QRect();
 if (!isMaximized() && !isFullScreen())
   return geometry();
 return d->topData()->normalGeometry; 
}

其中 d 是其 QWidgetPrivete 成员

3个函数中,前两个,Qt Manual中都有介绍,而第3个,文档中似乎没有涉及。

saveGeometry

看看保存了什么东西

const quint32 magicNumber = 0x1D9D0CB;
 quint16 majorVersion = 1;
 quint16 minorVersion = 0;
 stream << magicNumber
        << majorVersion
        << minorVersion
        << frameGeometry()
        << normalGeometry()
        << qint32(QApplication::desktop()->screenNumber(this))
        << quint8(windowState() & Qt::WindowMaximized)
        << quint8(windowState() & Qt::WindowFullScreen);

先是魔数和版本号,然后是 frameGeometry 和 normalGeometry,接着桌面号,最后是否最大化和全屏

restoreGeometry
  • 首先确保在屏幕的可视区域,如不在,进行调整
  • 如果是全屏或最大化:
if (maximized || fullScreen) {
 // set geomerty before setting the window state to make
 // sure the window is maximized to the right screen.
 setGeometry(restoredNormalGeometry);
 Qt::WindowStates ws = windowState();
 if (maximized)
     ws |= Qt::WindowMaximized;
 if (fullScreen)
     ws |= Qt::WindowFullScreen;
 setWindowState(ws);
 d_func()->topData()->normalGeometry = restoredNormalGeometry;
  • 如不是,移动到合适位置并设置窗体大小
} else {
 QPoint offset; 
#ifdef Q_WS_X11
 if (isFullScreen())
 offset = d_func()->topData()->fullScreenOffset; 
#endif
 setWindowState(windowState() & ~(Qt::WindowMaximized | Qt::WindowFullScreen));
 move(restoredFrameGeometry.topLeft() + offset); 
resize(restoredNormalGeometry.size()); 
}

///

QByteArray data;

QDataStream stream(&data, QIODevice::WriteOnly);

stream << QMainWindowLayout::VersionMarker;

这篇关于QWidget Geometry 保存与恢复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955894

相关文章

使用Python实现网络设备配置备份与恢复

《使用Python实现网络设备配置备份与恢复》网络设备配置备份与恢复在网络安全管理中起着至关重要的作用,本文为大家介绍了如何通过Python实现网络设备配置备份与恢复,需要的可以参考下... 目录一、网络设备配置备份与恢复的概念与重要性二、网络设备配置备份与恢复的分类三、python网络设备配置备份与恢复实

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat