Win7系统不得不说是非常好用的,也是目前为止占用份额最大的操作系统,其中win7有个效果,将窗体拖动到顶部时会自动最大化,拖动到左侧右侧时会自动半屏显示,再次拖动窗体到其他位置,会重新恢复之前的大小,这个效果还是比较人性化的,大大方便了很多用户的操作习惯。

在Qt中,如果是无边框窗体,(有边框窗体和操作系统窗体效果一致)并没有相关的API接口来实现这个效果,必须自己写代码来模拟这个效果,原理很简单,绑定事件过滤器,自动计算当前无边框窗体的位置和鼠标按下去的坐标,当到达顶部或者左侧右侧时,自动设置该窗体的geometry即可。

为了复用代码,我这里绑定的全局事件过滤器,这样只需要无边框窗体界面设置两行即可,无需重复编码。

无边框窗体代码:

this->setProperty("canMove", true);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);

核心代码:

#include "appinit.h"
#include "qapplication.h"
#include "qdesktopwidget.h"
#include "qevent.h"
#include "qwidget.h"
#include "qdebug.h"AppInit *AppInit::self = 0;
AppInit::AppInit(QObject *parent) : QObject(parent)
{
}bool AppInit::eventFilter(QObject *obj, QEvent *evt)
{QWidget *w = (QWidget *)obj;if (!w->property("canMove").toBool()) {return QObject::eventFilter(obj, evt);}//存储桌面宽高以及全屏/左侧半屏/右侧半屏 区域static int deskWidth = qApp->desktop()->availableGeometry().width();static int deskHeight = qApp->desktop()->availableGeometry().height();static QRect fullRect = qApp->desktop()->availableGeometry();static QRect leftRect = QRect(0, 0, deskWidth / 2, deskHeight);static QRect rightRect = QRect(deskWidth / 2, 0, deskWidth / 2, deskHeight);bool autoRect = w->property("autoRect").toBool();static QPoint mousePoint;static bool mousePressed = false;QMouseEvent *event = static_cast<QMouseEvent *>(evt);if (event->type() == QEvent::MouseButtonPress) {if (event->button() == Qt::LeftButton) {mousePressed = true;mousePoint = event->globalPos() - w->pos();return true;}} else if (event->type() == QEvent::MouseButtonRelease) {mousePressed = false;//计算全局坐标int x = event->globalPos().x();int y = event->globalPos().y();int offset = 10;//如果Y坐标在桌面顶部,则自动最大化//如果X坐标在桌面左侧,则自动左侧半屏幕//如果X坐标在桌面右侧,则自动右侧半屏幕//自动变化后记住当前窗体是自动产生的位置,以便下次恢复时自动应用变化前的位置if (!autoRect) {//存储最后一次的位置,自动矫正负数的坐标int oldX = w->geometry().x();oldX = oldX < 0 ? 0 : oldX;int oldY = w->geometry().y();oldY = oldY < 0 ? 0 : oldY;QRect oldRect = QRect(oldX, oldY, w->geometry().width(), w->geometry().height());if (y < offset) {w->setProperty("autoRect", true);w->setProperty("oldRect", oldRect);w->setGeometry(fullRect);} else if (x < offset) {w->setProperty("autoRect", true);w->setProperty("oldRect", oldRect);w->setGeometry(leftRect);} else if (x > (deskWidth - offset)) {w->setProperty("autoRect", true);w->setProperty("oldRect", oldRect);w->setGeometry(rightRect);}}return true;} else if (event->type() == QEvent::MouseMove) {if (mousePressed && (event->buttons() && Qt::LeftButton)) {if (!autoRect) {w->move(event->globalPos() - mousePoint);} else {QRect oldRect = w->property("oldRect").toRect();w->setProperty("autoRect", false);w->setGeometry(oldRect);}return true;}}return QObject::eventFilter(obj, evt);
}void AppInit::start()
{qApp->installEventFilter(this);
}

完整源码下载:http://git.oschina.net/feiyangqingyun/win7full

转载于:https://www.cnblogs.com/feiyangqingyun/p/6718249.html

Qt仿win7自动顶部最大化左侧右侧半屏效果相关推荐

  1. Qt编写主界面顶部和左侧导航

    界面效果: 资源文件 :  Qt编写主界面顶部和左侧导航代码及资源文件 (http://www.qtcn.org/bbs/read-htm-tid-65515.html) 1.工程目录 2.main. ...

  2. 仿猿题库练题滑动分屏效果

    SplitView 概述 仿猿题库练题里面效果,两个 View 分层,滑动中间的 View 可调节上下 View 的高度 目标效果 实现效果 实现原理 继承 ViewGroup ,内部分为三个子 Vi ...

  3. IOS端 vux中scroll滚动自动回弹到顶部或者左侧的解决办法

    IOS端 vux中scroll滚动自动回弹到顶部或者左侧的解决办法 问题表象 在滑动的时候,偶发性出现自动回弹到顶部的现象,通过onScroll回调发现scrollTop为-1造成回弹,开始寻找为什么 ...

  4. 计算机关闭的时候自动更新,win7自动更新关闭有什么影响_win7系统关闭自动更新的步骤-win7之家...

    在win7系统中,自带有自动更新功能,只要有新的更新发布,电脑就会在后台自动更新,但是自动更新的时候就会影响电脑运行速度,所以有用户就想要关闭自动更新功能,但是又不知道win7自动更新关闭有什么影响, ...

  5. 仿win7 aero_如何禁用Windows 7的Aero性能警告?

    仿win7 aero You know your computer isn't cutting edge, but there's no need for Windows 7 to constantl ...

  6. 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)

    阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...

  7. iOS仿今日头条顶部新闻分页

    仿今日头条顶部新闻分页 近日闲来无事总是刷头条,突然发现了一个有趣的现象,如下图: 当你滑动或者点击分页的名字的时候,不管当时那个分页在哪,最后都会被滚动到最中间.我又去翻了其他的资讯类的app,发现 ...

  8. Qt 仿QQ图片查看器

    最近项目中,由于需要查看图片.看了网上写的各种图片查看器.感觉都没有QQ图片查看器那种界面好看一点.并且放大了可以移动图片.为此,想着仿QQ图片查看器自己写了一个,如图: 主要实现的功能有: 鼠标滚轮 ...

  9. win7自动锁定计算机,win7设置自动锁屏的方法_win7自动锁定怎么设置

    有时候我们需要离开电脑一会,但是又不想一直开着屏幕,那么其实我们可以设置自动锁屏,但是许多用户不知道win7自动锁定怎么设置,为了帮助到大家,本文就给大家带来win7设置自动锁屏的方法. 具体步骤如下 ...

最新文章

  1. nginx 域名跳转 ---IP跳转----
  2. 有跳板机时,如何使用sshfs挂载远程服务器文件夹
  3. 高性能服务器 - window篇
  4. 单元测试之更强大的powermock
  5. 不让登陆_百万伙伴争代言 不让梦想咕咕叫 中国太保寿险公益活动提前117天汇聚300万颗爱心...
  6. NGUI如何创建自己的精灵图集
  7. Codeforces #364 DIV2
  8. mysql盲注ascii中文_[翻译]关于通过对8bit的ascii做右位移提高mysql盲注效率
  9. K8S_Google工作笔记0011---通过二进制方式_部署etcd集群
  10. Python eval 函数使用报错 name 'false' is not defined 已解决
  11. hp台式计算机u盘启动设置,惠普台式机U盘启动BIOS设置的方法教程
  12. flutter ScrollController attached to multiple scroll views
  13. 概率论与数理统计 期末突击复习
  14. Ch11. Threads 线程
  15. 如何快速更改电脑ip地址【图文教程】?
  16. 在几何画板中如何制作圆柱的侧面展开动画_几何画板如何制作圆柱体形成的过程动画...
  17. 使用 git 创建补丁和打补丁。
  18. keep 虚拟路线修改器_二次元出圈搞综艺,杨颖、虞书欣、小鬼打造二次元虚拟偶像...
  19. 开源OA协同办公平台搭建教程:服务管理中接口的调用权限
  20. 政务大数据资源平台项目可研方案(ppt可编辑)

热门文章

  1. 设置 iOS 应用的图标和名称
  2. 状态栏和navigationbar 关联上,结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数。...
  3. Geodatabase概述(翻译)
  4. C#可以对系统服务 检查增加删除启动停止重启(转)
  5. PyQt学习笔记(二)将PyQt项目转化为WIN下的可执行程序
  6. Spring获取前台参数的几种方式
  7. (江西财经大学第二届程序设计竞赛同步赛)E-是不是复读机
  8. spring基础——普通bean xml注入
  9. Java toString()方法的要点
  10. cass绘制围墙lisp_CASS中用LISP完成高程值的可视化处理