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

相关文章

使用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

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

如何恢复回收站中已删除/清空的文件

回收站清空后如何恢复已删除的文件?是否可以恢复永久删除的文件?或者最糟糕的是,如果文件直接被删除怎么办?本文将向您展示清空回收站后恢复已删除数据的最佳方法。 回收站清空后如何恢复已删除的文件? “回收站清空后我还能恢复已删除的文件吗?” 答案是肯定的,但是在这种情况下您将需要一个  回收站恢复工具 来从回收站中检索文件: 错误/永久删除回收站或任何数字存储设备中的文件 直接删除的文件/

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[