Qt之自定义界面(窗体缩放)
简述
通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭。
在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左、上、右、下、左上角、左下角、右上角、右下角时候,鼠标变为相应的样式,并且窗体可以随着鼠标拖动而进行放大、缩小。
- 简述
- 效果
- 窗体缩放
- 实现
- 接口说明
效果
窗体缩放
实现
包含头文件与需要用到的库
#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Windowsx.h>
#endif
使用nativeEvent进行窗体缩放
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{Q_UNUSED(eventType)MSG *param = static_cast<MSG *>(message);switch (param->message){case WM_NCHITTEST:{int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();// 鼠标区域位于标题栏按钮之上,则不进行处理QList<QPushButton *> buttons = m_pTitleBar->findChildren<QPushButton *>();foreach (QPushButton *pButton, buttons){if (pButton->geometry().contains(QPoint(nX, nY))){*result = HTCLIENT;return true;}}// 鼠标区域位于标题栏中,进行移动if (nX >= m_nBorder && nX <= this->width() - m_nBorder&& nY >= m_nBorder && nY <= m_pTitleBar->height()){*result = HTCAPTION;return true;}// 鼠标区域位于窗体边框,进行缩放if ((nX > 0) && (nX < m_nBorder))*result = HTLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width()))*result = HTRIGHT;if ((nY > 0) && (nY < m_nBorder))*result = HTTOP;if ((nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOM;if ((nX > 0) && (nX < m_nBorder) && (nY > 0)&& (nY < m_nBorder))*result = HTTOPLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > 0) && (nY < m_nBorder))*result = HTTOPRIGHT;if ((nX > 0) && (nX < m_nBorder)&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMRIGHT;return true;}}return QWidget::nativeEvent(eventType, message, result);
}
接口说明
Qt5与Qt4其中的一个区别就是用nativeEvent代替了winEvent。
nativeEvent主要用于进程间通信-消息传递。在这里我们主要进行窗体缩放,其中还添加了一些限制,比如:
- 鼠标区域位于标题栏按钮之上,则不进行处理。
- 鼠标区域位于标题栏中,进行移动。
使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码-在mousePressEvent中使用SendMessage来进行移动。
当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。
Qt之自定义界面(窗体缩放)相关推荐
- Qt中不规则窗体和部件的实现
Qt中不规则窗体和部件的实现 描述:a.png 窗口背景图 图片: 描述:mask.png 窗口掩码图 图片: 描述:toolbutton.png 按钮背景图 图片: 描述:toolbutton_ma ...
- [C#]无边框窗体缩放的虚线框怎么实现
protected override void WndProc(ref Message m) { switch (m.Msg) { case 0xA3://拦截鼠标非客户区左键双击消息 ...
- WinForm窗体缩放动画
WinForm自带的窗体大小发生改变的时候,当内存不够的时候,会出现界面停滞的现象,会出现许多的条条纹纹,给人很不好的感觉,这里提供一个WinForm窗体缩放时会有一个渐变的动画效果给大家. 思路是这 ...
- Qt Creator创建可缩放的按钮和边框
Qt Creator创建可缩放的按钮和边框 创建可缩放的按钮和边框 创建按钮类型 构造按钮组件 使用状态更改组件属性值 创建可缩放的按钮和边框 您可以使用"边框图像"类型将图像(例 ...
- 【转】QT实现不规则窗体
看到好文章,收藏一下: 看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式, ...
- [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景
很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...
- [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景_vortex_新浪博客...
很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...
- Qt无边框窗体(Windows)
Qt无边框窗体Windows篇 去掉标题栏和边框 实现拖拽功能 还原窗体功能 注意点 我们可以做的更好 添加阴影 亚克力面板效果 结语 去掉标题栏和边框 首先第一步我们要通过设置系统绘制的边框消失 s ...
- C++,QT多个窗体切换,widget 多个页面切换跳转显示
C++,QT多个窗体切换,widget,QTimer 3个页面切换跳转,使用wdiget 的方式 源码工程链接 先看效果: onewidget.h #ifndef ONEWIDGET_H #defin ...
最新文章
- fegin通信中速度慢等待解决异常
- 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
- JVM调优总结(二)
- c语言 程序循环,C语言程序设计-循环例子
- 一款不错的网站压力测试工具webbench
- js触发button的点击事件
- 瑞士行-少女峰,峡谷徒步
- bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
- 10.软件架构设计:大型网站技术架构与业务架构融合之道 --- 事务一致性
- [AutoSar]RTE运行逻辑、通信逻辑与接口实现
- jetty快速入门与嵌入使用 jetty
- html页面加密js,javascript怎么加密?
- 针对初学者的 MQL 5 中的自定义指标
- php创建透明图片,php imagecreatetruecolor 创建高清和透明图片代码小结
- linux dns配置服务器报告,Linux DNS服务实验报告
- IPC$局域网入侵详解
- 动态电路中的动态元件——电容和电感
- 手把手 VM虚拟机安装deepin系统
- 模拟人生显示无法连接服务器,模拟人生总是显示无法连接网络
- 如何在VSCode配置PHP开发环境(详细版)