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

  1 virtual bool nativeEvent(const QByteArray &, void *, long *) Q_DECL_OVERRIDE;
  2
  3 {
  4
  5     Q_UNUSED(eventType);
  6
  7     MSG* msg = reinterpret_cast(message);
  8
  9     if (winEvent(msg, result))
 10
 11     {
 12
 13         return true;
 14
 15     }
 16
 17     else
 18
 19     {
 20
 21         return QWidget::nativeEvent(eventType, message, result);
 22
 23     }
 24
 25 }
 26
 27 如下方法是在qt事件循环之前调用的,如果返回值为true,则该事件循环不进入qt事件循环,否则进入,result是一个输出型参数,我们可以通过赋值给result不同的值,来控制鼠标的状态
 28
 29 HTCAPTION:鼠标可以拖拽
 30
 31 HTLEFT / HTRIGHT:鼠标可以左右拖拽
 32
 33 HTTOP / HTBOTTOM:鼠标可以上下拖拽
 34
 35 HTTOPLEFT / HTBOTTOMRIGHT:鼠标可以左上或者右下拖拽
 36
 37 HTTOPRIGHT / HTBOTTOMLEFT:鼠标可以右上或者左下拖拽
 38
 39 bool CCailianMainWindow::winEvent(MSG *message, long *result)
 40
 41 {
 42
 43     static int width = 4;//可检测到鼠标状态的宽度
 44
 45     bool res = false;
 46
 47     if (isMaximized())
 48
 49     {
 50
 51         return res;
 52
 53     }
 54
 55     switch (message->message)
 56
 57     {
 58
 59     case WM_NCHITTEST:
 60
 61         int xPos = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();
 62
 63         int yPos = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();
 64
 65         if (QWidget * childW = this->childAt(xPos, yPos))
 66
 67         {
 68
 69             if (childW == m_WindowTitle)//我自己的窗口头,支持鼠标拖拽
 70
 71             {
 72
 73                 *result = HTCAPTION;
 74
 75                 res = true;
 76
 77             }
 78
 79         }
 80
 81         else
 82
 83         {
 84
 85             return res;
 86
 87         }
 88
 89         if (xPos >= 0 && xPos < width)
 90
 91         {
 92
 93             *result = HTLEFT;
 94
 95             res = true;
 96
 97         }
 98
 99         if (xPos > (this->width() - width) && xPos < this->width())
100
101         {
102
103             *result = HTRIGHT;
104
105             res = true;
106
107         }
108
109         if (yPos >= 0 && yPos < width)
110
111         {
112
113             *result = HTTOP;
114
115             res = true;
116
117         }
118
119         if (yPos > (this->height() - width) && yPos < this->height())
120
121         {
122
123             *result = HTBOTTOM;
124
125             res = true;
126
127         }
128
129         if (xPos >= 0 && xPos < width && yPos >= 0 && yPos < width)
130
131         {
132
133             *result = HTTOPLEFT;
134
135             res = true;
136
137         }
138
139         if (xPos > (this->width() - width) && xPos < this->width() && yPos >= 0 && yPos < width)
140
141         {
142
143             *result = HTTOPRIGHT;
144
145             res = true;
146
147         }
148
149         if (xPos >= 0 && xPos < width && yPos >(this->height() - width) && yPos < this->height())
150
151         {
152
153             *result = HTBOTTOMLEFT;
154
155             res = true;
156
157         }
158
159         if (xPos > (this->width() - width) && xPos < this->width() && yPos >(this->height() - width) && yPos < this->height())
160
161         {
162
163             *result = HTBOTTOMRIGHT;
164
165             res = true;
166
167         }
168
169     }
170
171     return res;
172
173 }

View Code

图1 拖拽
图2 修改大小 

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

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

 1 case WM_NCLBUTTONDBLCLK:
 2
 3 {
 4
 5     HWND hWnd = (HWND)this->winId();
 6
 7     if (::IsZoomed(hWnd))
 8
 9     {
10
11         ShowWindow(hWnd, SW_RESTORE);
12
13     }
14
15     else
16
17     {
18
19         ShowWindow(hWnd, SW_MAXIMIZE);
20
21     }
22
23     res = false;
24
25 }
26
27 break;

View Code

注意:要支持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实例

转载于:https://www.cnblogs.com/swarmbees/p/5621543.html

qt 拖拽 修改大小相关推荐

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

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

  2. Qt 拖拽 动态 垃圾箱

    前些天看了Qt的拖拽,觉得Qt的拖拽还是蛮灵活:但widgets在移动端类似的app应用场景下,确实显得有一些笨拙:但同时它功能强大,灵活性非常高. 我在这里实现的是一个类似于android手机卸载软 ...

  3. iOS 自定义抖音效果进度条实现拖拽修改播放进度

    文章目录 效果图 实现原理 核心代码 手势响应 计算出手势的进度 和占的宽度比例 完整代码 效果图 实现原理 在整个进度条视图上添加拖拽手势 UIPanGestureRecognizer ,根据loc ...

  4. React 拖拽改变大小,react-resizable 属性详解

    源于布局需求,要求Antd的Layout组件中,侧边栏Sider可以拖拽改变宽度-- 开源插件,基于react-draggable插件(同一作者),详见<react-resizable>: ...

  5. python qt 拖拽组件使用方法_Python QT组件库qtwidgets的使用

    虽然Qt提供了不少现成的组件,但是在Python中使用PyQt5或PySide2进行图形界面程序开发的过程,还是免不了要根据自己的需求组合一些小部件以形成新的自定义组件. 最近州的先生在写一个桌面图形 ...

  6. Qt中自定义控件拖拽,QT实现拖拽功能--小白友好版

    目录 创作背景 开发环境 运行效果 实现原理 1.参考文档 2.主要原理 实现过程 1.首先是重写QLabel 2.第二步是使用自己写的Label类 总结 创作背景         写这篇文章主要有一 ...

  7. html表格宽度拖拽,Js拖拽实现改变Table的列宽解决方案

    Js拖拽实现改变Table的列宽 如题,楼主是Js小白,最近遇到问题,需要用Js实现GridView的列拖拽改变大小,在网上找到一段代码如下: function MouseDownToResize(o ...

  8. html5拖拽图片批量ajax无刷新进度上传

    1.前端拖拽图片 之前有篇文章说到HTML5的拖拽(drag.drop,详见:/post/jquery-plugin-1-jquery-drag-and-html5-draggable-api-and ...

  9. python小技巧大应用--基础实用漂亮界面(无边框,圆角,可拖拽)

    这回要实现一个漂亮的基础界面,要具有如下特色: 无边框,圆角,漂亮的背景,可拖拽移动,具有最小化,关闭按钮,界面与代码分离,支持qss 先展示一下最后的效果: 那就开始工作吧: 1.通过Qt Desi ...

最新文章

  1. 2018上半年约26亿条数据泄露
  2. IDEA配置maven报错解决方案
  3. 资深程序员不一定当得了软件架构师
  4. centos6.6安装python2.7
  5. ConfigUtil读取配置文件
  6. python中shutil.copyfile的用法_Python shutil.copyfile()用法及代码示例
  7. Ajax的get与post的区别,什么时候使用post?
  8. 07@Pattern_Note_命令模式
  9. 【codevs30123037】线段覆盖4、5,姗姗来迟
  10. 三星Galaxy Fold 2渲染图曝光:怎么折是个问题
  11. 第一次立会(2019.3.24)
  12. 计算机招聘网站排名,2014年互联网名企招聘人数的高校
  13. [HNOI2016]序列(莫队,RMQ)
  14. 京东php乱码,浏览器打开京东商城网页显示乱码该怎么办?
  15. AutoCad二次开发-插入DWG参照 Teigha库
  16. 新手焊接电路板_手把手教您如何掌握焊接电路板基础知识
  17. 文件管理(文件系统)
  18. 中国电子学会2022年12月份青少年软件编程Python等级考试试卷三级真题(含答案)
  19. 解决关闭浏览器后再打开,访问网站仍然自动登陆的问题
  20. 制作立体图像(上):红蓝眼镜原理

热门文章

  1. 用openssl跟Gmail的smtp对话(一)
  2. JS是世界上最好的语言—— 使用Electron开发桌面应用(一)
  3. Zabbix3.X---Zabbix _Agent主动模式的监控(Active)
  4. maven项目配置Jetty服务器
  5. static成员函数不能调用non-static成员函数
  6. 另一种公钥私钥认证方式
  7. WEBI 中的参数传递
  8. GDI+ 获取本地电脑的图片编码器
  9. Visual C#使用DirectX实现视频播放
  10. linux互信封装脚本,使用shell脚本实现自动SSH互信功能