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

Qt仿win7自动顶部最大化左侧右侧半屏效果的更多相关文章

  1. 仿win7窗体自动顶部最大化左侧右侧半屏效果(改写nativeEvent,使用AdjustWindowRectEx)

    #include "HMainWindow.h" #include <QApplication> #ifdef Q_OS_WIN #include <qt_win ...

  2. Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)

    一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...

  3. jQuery制作顶部与左侧锚点板块定位功能带动画跳转特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. ElementUI+命名视图实现复杂顶部和左侧导航栏

    在了解了命名视图的用途后,发现用命名视图来实现复杂导航更加省力.更多知识请参考这里 这里只说明重要配置内容,其他内容配置请参考上一篇初始版本: ElementUI 复杂顶部和左侧导航栏实现 或参考文末 ...

  5. ElementUI 复杂顶部和左侧导航栏实现

    描述:如图 项目路径如下图所示: 代码实现: 首先在store.js中添加两个状态: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vue ...

  6. WPF仿Win7便笺

    最近用WPF写了个仿WIN7下面的便笺小工具,还算是比较华丽的,相似度99%以上吧,在集成了便笺原有的功能以外,当然也做了略微的修改,比如加了关于作者版本信息和修改了原有删除便笺的系统弹出框.软件开机 ...

  7. 如何关闭WIN7自动配置 IPV4 地址 169.254

    如何关闭WIN7自动配置 IPV4 地址 169.254 以管理员身份运行cmd.exe 输入:netsh winsock reset catalog 回车 输入:netsh int ip reset ...

  8. 【转】 Qt如何设置自动补全快捷键

    原文:https://blog.csdn.net/u014597198/article/details/52797435 在用Qt编程的时,它默认是以“CTRL+空格”来作为自动补全的快捷键的,但是这 ...

  9. QT Creator 代码自动补全

    QT Creator 代码自动补全 用QT Creater编程,如果没有自动补全是很痛苦的事情,于是便查阅了QT的文档,发现CTRL+SPACE是自 动补全的快捷键;但是在 Creater里使用居然没 ...

随机推荐

  1. base64位加密解密

    1.base64位加密base64是用于传输8Bit字节代码,由上图的编码表可以知道,编码后的内容只包含这64个字符类型,所以称为base64编码 2.编码过程 : 首先将待编码的内容转换成8位二进制 ...

  2. 中文编程语言之Z语言初尝试: ZLOGO 4

    原文: https://zhuanlan.zhihu.com/p/31505895. 作者为本人. @TKT2016 开发的Z语言(ZLOGO是它的一个部分)是本人至今看到的唯一一个仍活跃开发的开源且 ...

  3. PHP招聘那些事,公司真的不需要培训班出来的人么?

    就业形势严峻的情况下,每个企业对于人才的需求都不一样,并不是说公司不愿意招聘培训班出来的人,而是看你的能力是不是能胜任企业招聘人才的需求,是不是能给企业带来价值的人. 现在市面上的培训机构多如牛毛,然 ...

  4. linux上安装php7 memcache扩展 和 安装服务端memcached

    linux上安装memcached不算太困难.唯一让本人感到困难的是 php7的memcache扩展安装.真的蛋疼! 先说安装服务端 memcached 1. 首先安装Libevent事件触发管理器. ...

  5. MySQL 性能优化的最佳20多条经验分享(三)(转)

    16. 垂直分割 "垂直分割"是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段, ...

  6. 网页设计——3.html运行原理,基本标签

    一.运行原理 (1)本地运行 自己写的html网页用电脑上浏览器打开,就是实现了本地运行. 可以把浏览器当成一个软件,可以打开html文件. (2)远程访问 远程访问就是你用自己电脑在网上浏览一些网站 ...

  7. dom4j详解

    Dom4j下载及使用Dom4j读写XML简介要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:htt ...

  8. 【Keras】从两个实际任务掌握图像分类

    我们一般用深度学习做图片分类的入门教材都是MNIST或者CIFAR-10,因为数据都是别人准备好的,有的甚至是一个函数就把所有数据都load进来了,所以跑起来都很简单,但是跑完了,好像自己还没掌握图片 ...

  9. C++ list forward_list

    list,forward_list list:双向链表 forward_list:单向链表 在任何位置添加元素,删除元素都很快,但随机访问元素则很慢 声明和初始化 list<T> l; l ...

  10. 【剑指Offer学习】【面试题21:包括min 函数的栈】

    题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数.在该栈中.调用min.push 及pop的时间复杂度都是0(1) 解题思路: 把每次的最小元素(之前的最小元素和新压入战 ...