Qt仿win7自动顶部最大化左侧右侧半屏效果
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自动顶部最大化左侧右侧半屏效果相关推荐
- Qt编写主界面顶部和左侧导航
界面效果: 资源文件 : Qt编写主界面顶部和左侧导航代码及资源文件 (http://www.qtcn.org/bbs/read-htm-tid-65515.html) 1.工程目录 2.main. ...
- 仿猿题库练题滑动分屏效果
SplitView 概述 仿猿题库练题里面效果,两个 View 分层,滑动中间的 View 可调节上下 View 的高度 目标效果 实现效果 实现原理 继承 ViewGroup ,内部分为三个子 Vi ...
- IOS端 vux中scroll滚动自动回弹到顶部或者左侧的解决办法
IOS端 vux中scroll滚动自动回弹到顶部或者左侧的解决办法 问题表象 在滑动的时候,偶发性出现自动回弹到顶部的现象,通过onScroll回调发现scrollTop为-1造成回弹,开始寻找为什么 ...
- 计算机关闭的时候自动更新,win7自动更新关闭有什么影响_win7系统关闭自动更新的步骤-win7之家...
在win7系统中,自带有自动更新功能,只要有新的更新发布,电脑就会在后台自动更新,但是自动更新的时候就会影响电脑运行速度,所以有用户就想要关闭自动更新功能,但是又不知道win7自动更新关闭有什么影响, ...
- 仿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 ...
- 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)
阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...
- iOS仿今日头条顶部新闻分页
仿今日头条顶部新闻分页 近日闲来无事总是刷头条,突然发现了一个有趣的现象,如下图: 当你滑动或者点击分页的名字的时候,不管当时那个分页在哪,最后都会被滚动到最中间.我又去翻了其他的资讯类的app,发现 ...
- Qt 仿QQ图片查看器
最近项目中,由于需要查看图片.看了网上写的各种图片查看器.感觉都没有QQ图片查看器那种界面好看一点.并且放大了可以移动图片.为此,想着仿QQ图片查看器自己写了一个,如图: 主要实现的功能有: 鼠标滚轮 ...
- win7自动锁定计算机,win7设置自动锁屏的方法_win7自动锁定怎么设置
有时候我们需要离开电脑一会,但是又不想一直开着屏幕,那么其实我们可以设置自动锁屏,但是许多用户不知道win7自动锁定怎么设置,为了帮助到大家,本文就给大家带来win7设置自动锁屏的方法. 具体步骤如下 ...
最新文章
- nginx 域名跳转 ---IP跳转----
- 有跳板机时,如何使用sshfs挂载远程服务器文件夹
- 高性能服务器 - window篇
- 单元测试之更强大的powermock
- 不让登陆_百万伙伴争代言 不让梦想咕咕叫 中国太保寿险公益活动提前117天汇聚300万颗爱心...
- NGUI如何创建自己的精灵图集
- Codeforces #364 DIV2
- mysql盲注ascii中文_[翻译]关于通过对8bit的ascii做右位移提高mysql盲注效率
- K8S_Google工作笔记0011---通过二进制方式_部署etcd集群
- Python eval 函数使用报错 name 'false' is not defined 已解决
- hp台式计算机u盘启动设置,惠普台式机U盘启动BIOS设置的方法教程
- flutter ScrollController attached to multiple scroll views
- 概率论与数理统计 期末突击复习
- Ch11. Threads 线程
- 如何快速更改电脑ip地址【图文教程】?
- 在几何画板中如何制作圆柱的侧面展开动画_几何画板如何制作圆柱体形成的过程动画...
- 使用 git 创建补丁和打补丁。
- keep 虚拟路线修改器_二次元出圈搞综艺,杨颖、虞书欣、小鬼打造二次元虚拟偶像...
- 开源OA协同办公平台搭建教程:服务管理中接口的调用权限
- 政务大数据资源平台项目可研方案(ppt可编辑)
热门文章
- 设置 iOS 应用的图标和名称
- 状态栏和navigationbar 关联上,结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数。...
- Geodatabase概述(翻译)
- C#可以对系统服务 检查增加删除启动停止重启(转)
- PyQt学习笔记(二)将PyQt项目转化为WIN下的可执行程序
- Spring获取前台参数的几种方式
- (江西财经大学第二届程序设计竞赛同步赛)E-是不是复读机
- spring基础——普通bean xml注入
- Java toString()方法的要点
- cass绘制围墙lisp_CASS中用LISP完成高程值的可视化处理