写次篇文章之前,qt窗口的放大缩小和拖拽我都是通过setGeometry方法实现的,但是作为windows程序,windows支持橡 皮筋式(拖拽时有一个虚框)拖拽和拉伸。通过setGeometry方式实现功能是没有这种效果,幸好qt5中提供了一个本地事件处理接口 nativeEvent,具体功能可以看帮助文档,本文只讲述用该接口实现窗口放大、缩小和拖拽,具体实现代码如下:

 virtual bool nativeEvent(const QByteArray &, void *, long *) Q_DECL_OVERRIDE;

 {

     Q_UNUSED(eventType);

     MSG* msg = reinterpret_cast(message);

     if (winEvent(msg, result))

     {

         return true;

     }

     else

     {

         return QWidget::nativeEvent(eventType, message, result);

     }

 }

 如下方法是在qt事件循环之前调用的,如果返回值为true,则该事件循环不进入qt事件循环,否则进入,result是一个输出型参数,我们可以通过赋值给result不同的值,来控制鼠标的状态

 HTCAPTION:鼠标可以拖拽

 HTLEFT / HTRIGHT:鼠标可以左右拖拽

 HTTOP / HTBOTTOM:鼠标可以上下拖拽

 HTTOPLEFT / HTBOTTOMRIGHT:鼠标可以左上或者右下拖拽

 HTTOPRIGHT / HTBOTTOMLEFT:鼠标可以右上或者左下拖拽

 bool CCailianMainWindow::winEvent(MSG *message, long *result)

 {

     static int width = ;//可检测到鼠标状态的宽度

     bool res = false;

     if (isMaximized())

     {

         return res;

     }

     switch (message->message)

     {

     case WM_NCHITTEST:

         int xPos = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();

         int yPos = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();

         if (QWidget * childW = this->childAt(xPos, yPos))

         {

             if (childW == m_WindowTitle)//我自己的窗口头,支持鼠标拖拽

             {

                 *result = HTCAPTION;

                 res = true;

             }

         }

         else

         {

             return res;

         }

         if (xPos >=  && xPos < width)

         {

             *result = HTLEFT;

             res = true;

         }

         if (xPos > (this->width() - width) && xPos < this->width())

         {

             *result = HTRIGHT;

             res = true;

         }

         if (yPos >=  && yPos < width)

         {

             *result = HTTOP;

             res = true;

         }

         if (yPos > (this->height() - width) && yPos < this->height())

         {

             *result = HTBOTTOM;

             res = true;

         }

         if (xPos >=  && xPos < width && yPos >=  && yPos < width)

         {

             *result = HTTOPLEFT;

             res = true;

         }

         if (xPos > (this->width() - width) && xPos < this->width() && yPos >=  && yPos < width)

         {

             *result = HTTOPRIGHT;

             res = true;

         }

         if (xPos >=  && xPos < width && yPos >(this->height() - width) && yPos < this->height())

         {

             *result = HTBOTTOMLEFT;

             res = true;

         }

         if (xPos > (this->width() - width) && xPos < this->width() && yPos >(this->height() - width) && yPos < this->height())

         {

             *result = HTBOTTOMRIGHT;

             res = true;

         }

     }

     return res;

 }
图1 拖拽
图2 修改大小

如上图所示,红色箭头指的就是拖拽和改变大小时出现的白色框

这样处理后的标题栏(m_WindowTitle)不能接受到mouseDoubleClickEvent事件,因此还需要自己手动修改窗口大小,代码如下,添加到上述swtich语句中

 case WM_NCLBUTTONDBLCLK:

 {

     HWND hWnd = (HWND)this->winId();

     if (::IsZoomed(hWnd))

     {

         ShowWindow(hWnd, SW_RESTORE);

     }

     else

     {

         ShowWindow(hWnd, SW_MAXIMIZE);

     }

     res = false;

 }

 break;

注意:要支持windows的这种特性,需要通过代码设置

showFullWindow:true代表拖动和改变大小时窗口实时变化;false代表橡皮筋式放大,如上图所示

SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, showFullWindow ? TRUE : FALSE, NULL, 0);

================================================

时隔10几天,当我测试新功能时发现一个问题,特此记录:

在xp系统上qt程序没有任务栏菜单,但是win7和win10正常,给qt程序手动添加​Qt::WindowSystemMenuHint属性后,3系统都有菜单,但是nativeEvent方法不能放大缩小了,解决办法暂时没找到

====================================

今儿突然想到QMainWindow,这个右下角有一个可以支持放大做小的功能,最后看了源码,发现由一个QSizeGrip类,这个类可以实现所在顶层 QWindow的放大和缩小,特此记录​,此时结果如下图3。这个类支持橡皮筋放大缩小,和前文所述nativeEvent实现效果相同

图3
QSizeGrip实例

qt 拖拽 修改大小的更多相关文章

  1. qt 拖拽 修改大小(二)

    最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录. 首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_S ...

  2. qt 拖拽 修改大小(使用了nativeEvent和winEvent)

    http://www.cnblogs.com/swarmbees/p/5621543.html http://blog.sina.com.cn/s/blog_9e59cf590102w3r6.html

  3. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式

    开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...

  4. Qt拖拽界面 (*.ui) 缩放问题及解决办法

    问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...

  5. 解决Delphi图形化界面的TEdit、TLable等组件手动拖拽固定大小,但是编译之后显示有差别的情况

    经常遇到这样的情况,在我们使用Delphi的可视化工具进行UI设计的时候,我们拖拽TEdit或者Label组件,并且在可视化界面上设置它们的长.宽 但是当我们编译和运行程序的时候,却发现真正显示出来的 ...

  6. Qt拖拽界面 (*.ui) 缩放问题及解决办法(在最顶层放一个Layout)

    问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...

  7. react之每日一更(实现canvas拖拽,增、删、改拖拽模块大小功能)

    效果图: import React, { Component } from 'react'; import scaleImage from './images/scale.png'; import c ...

  8. jQuery拖拽改变元素大小

    一个非常简单的例子,体验效果:http://keleyi.com/keleyi/phtml/jqtexiao/29.htm 以下是完整代码,保存到HTML文件打开也可以体验效果. <!DOCTY ...

  9. 超强的纯 CSS 鼠标点击拖拽效果

    背景 鼠标拖拽元素移动,算是一个稍微有点点复杂的交互. 而在本文,我们就将打破常规,向大家介绍一种超强的仅仅使用纯 CSS 就能够实现的鼠标点击拖拽效果. 在之前的这篇文章中 -- 不可思议的纯 CS ...

随机推荐

  1. spring boot 项目打成war包部署到服务器

    这是spring boot学习的第二篇了,在上一篇已经整合了spring boot项目了,如果还有小伙伴没有看得可以先去看第一篇 基础整合spring boot项目 到这里的小伙伴应该都是会整合基本的 ...

  2. Beginning Python Games Development

    Like music and movies, video games are rapidly becoming an integral part of our lives. Over the year ...

  3. Kubernetes系列之Helm介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...

  4. ubuntu“少折腾”

    1.python版本默认python3 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 sudo ...

  5. 雕刻机制作 PCB 指南

    之前使用过感光蓝油制作过 PCB,虽然感光法精度高,但个人制作耗时耗力,发给厂家周期又很长.看到国外的网友使用雕刻机制作 PCB  视频之后.几番周折之后还是成功了.有感于网上几乎没有一份完整的雕刻机 ...

  6. windows10 docker镜像存储位置修改

    =====================================下面做法无效,无法成功启动docker=================================== 安装Docker ...

  7. 通过s3cmd上传css文件到s3导致样式加载失败

    情景说明: 将css文件上传到aws s3存储桶中,通过浏览器访问页面,发现css文件渲染失败. 通过浏览器工程模式发现css为 Content-Type: text/html,正确的 Content ...

  8. 无法运行 vue-manage-system@3.1.0 dev: `webpack-dev-server --inline --progress --

    一个项目的变大好多人开发,难免会有很多的冲突.每次跟新代码都要一个坑一个坑的解决的.这次遇到这个坑好大.急死了.... 百度了好多说占用端口,试了好几遍不行.最终还是要去查原因的....经过了几个小时 ...

  9. Docker安装及基本操作

    系统环境 CentOS Linux release 7.5.1804 (Core) 安装依赖包 更新系统软件 yum update 安装docker yum install docker 启动dock ...

  10. Vue(二十七)当前GitHub上排名前十的热门Vue项目(转载)

    原文地址:https://my.oschina.net/liuyuantao/blog/1510726 1. ElemeFE/element tag:vue javascript components ...