Qt——鼠标拖动调整窗口大小
要求:鼠标移到界面边角时,鼠标样式相应地发生改变。
实现方法一:
重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大小,或者是拖动界面。思路如上,实现起来很简单。但是存在一个问题,如果界面中放了一些其它控件,比如listWidget,此时鼠标在界面边缘移动速度稍微快一些,mouseMoveEvent就会被子控件截获了,鼠标样式不会改变,对于该方法的这个问题,我还没想到好的解决办法。
实现方法二:
在Qt中处理windows事件,具体实现如下,参考网上一些内容,我顺便修改优化了一下,源代码如下:
#ifndef MBASEWIDGET_H
#define MBASEWIDGET_H#include <QtWidgets/QWidget>
#include "windows.h"class MBaseWidget : public QWidget
{Q_OBJECTpublic:MBaseWidget(QWidget *parent);~MBaseWidget();void setMarginWidth(const int &); //设置鼠标可以在界面边缘多大范围内拖动改变界面大小void serResizable(bool); //设置是否可以拖动改变大小protected:bool nativeEvent(const QByteArray & eventType, void * message, long * result);bool winEvent(MSG *message, long *result);private:int m_iMarginWidth;bool m_bCanResize;
};#endif // MBASEWIDGET_H
#include "MBaseWidget.h"
#include "windowsx.h"MBaseWidget::MBaseWidget(QWidget *parent): QWidget(parent)
{m_iMarginWidth = 3;m_bCanResize = true;setWindowFlags(Qt::FramelessWindowHint);
}MBaseWidget::~MBaseWidget()
{}void MBaseWidget::setMarginWidth(const int &iWidth)
{m_iMarginWidth = iWidth;
}void MBaseWidget::serResizable(bool bCanResize)
{m_bCanResize = bCanResize;
}//处理windows事件,在QT5中,被函数nativeEvent取代
bool MBaseWidget::winEvent(MSG *message, long *result)
{switch (message->message){case WM_NCHITTEST:int iPosX = GET_X_LPARAM(message->lParam) - this->frameGeometry().x();//鼠标位置xint iPosY = GET_Y_LPARAM(message->lParam) - this->frameGeometry().y();//鼠标位置y*result = HTCAPTION;if (!m_bCanResize){return true;//返回为真,此时仍可拖动,但无法改变大小}if (iPosX >= 0 && iPosX <= m_iMarginWidth){*result = HTLEFT;//左int iHeight = this->height();if (iPosY >= 0 && iPosY <= m_iMarginWidth){*result = HTTOPLEFT;//左上}if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight){*result = HTBOTTOMLEFT;//左下}return true;}int iWidth = this->width();int iHeight = this->height();if (iPosX >= iWidth - m_iMarginWidth && iPosX <= iWidth){*result = HTRIGHT;//右if (iPosY >= 0 && iPosY <= m_iMarginWidth){*result = HTTOPRIGHT;//右上return true;}if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight){*result = HTBOTTOMRIGHT;//右下return true;}return true;}if (iPosY >= 0 && iPosY <= m_iMarginWidth){*result = HTTOP;//上return true;}if (iPosY >= iHeight - m_iMarginWidth && iPosY <= iHeight){*result = HTBOTTOM;//下return true;}return true;}return false;
}bool MBaseWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{return winEvent((MSG*)message, result);
}
这种方法是借助windows来实现的,所以受系统的限制,比如,拖动放大到与屏幕一样大时,就不能继续放大了,而且其它类直接继承这个类可能会出现问题。
实现方法三:
既然通过mouseMoveEvent不能解决鼠标的样式问题,那么可以考虑通过其它事件来实现,下面是我实现的一个类,包括头文件、dll和lib文件。
在VS中项目属性-链接器中进行相关配置即可。
点击下载
转载于:https://www.cnblogs.com/hellovenus/p/5093362.html
Qt——鼠标拖动调整窗口大小相关推荐
- 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】
[QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...
- Qt鼠标拖动绘制基本几何图形
概述 用Qt鼠标事件实现基本几何图形的绘制,支持直线.矩形.圆形.椭圆.后期可以在此基础上进行扩展. 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独 ...
- Python使用鼠标滚轮调整tkinter应用程序窗口大小
图书推荐: <Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等 ...
- python tkinter获取屏幕大小_Python使用鼠标滚轮调整tkinter应用程序窗口大小
图书推荐:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配套 ...
- Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现
文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...
- vimrc配置 鼠标光标_在“提示”框中:即时调整窗口大小,包含鼠标光标并了解电池配置...
vimrc配置 鼠标光标 Every week we dip into the reader mail bag and pull out tips and tricks to share. This ...
- OS X 使用技巧——轻松地调整窗口大小
如果你想调整窗口大小,只需要把鼠标指针悬停在窗口边框上.当它变成双向箭头时,点击并拖动鼠标即可完成这一操作. 但在实际操作中,迅速把鼠标指针定位到边框上比较困难. 解决的办法是:在终端输入以下命令: ...
- windows调整窗口大小_175 Windows 7调整,提示和操作方法文章
windows调整窗口大小 Windows 7 is being officially released on October 22nd, which also happens to be today ...
- QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等 框架搭建 UI设计 mp3.h mp3.cpp 隐藏窗口标题 最大化 最小化 关闭 框架搭建 .p ...
最新文章
- 工作几天被裁员,难受
- Cloud一分钟 | 苹果更新“隐私页面”;中国联通大数据正式升级,进入数智新阶段...
- ajax结合接口 分页插件
- v-for和v-if同时使用(案例分析:循环最新的前14条数据显示) - 踩坑篇
- 心中无敌,则天下无敌
- dz中footer.php在哪找,去掉DZ顶部标题,美化底部左下方版权,详细教程
- 联通微服务怎么还款_重磅!中国联通推出微信签约代扣新功能
- 24-思科防火墙:ASA透明防火墙实验
- 银耳椰椰——Alpha冲刺Day09
- win7系统域服务器,win7安装域服务器
- OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧
- php 公众平台开发教程,微信公众平台开发入门教程
- 华三交换机升级的ipe文件_H3C交换机升级步骤
- 《黑白团团队》第八次团队作业:Alpha冲刺 第一天
- 纯html5的树形菜单,一个简单的js树形菜单
- 深入理解金融交易报文Iso8583协议
- FileSystemWatcher 基础用法
- 针对严峻的网络安全环境,公司就当如何应对?
- 计算机又坏了,第二次回家
- 清除系统垃圾的bat文件
热门文章
- python中dom模块_Python中使用dom模块生成XML文件示例
- 【若依(ruoyi)】解决同一Tomcat下两个/多个若依(ruoyi)项目部署报错
- Ubuntu连接WiFi
- bootstraptable 汇总_bootstrap-table事件汇总
- python把字符串转化为字典_python 将字符串转换成字典dict的各种方式总结
- ubuntu查看默认python版本_ubuntu中修改默认Python版本号
- mysql事务提交模式
- [别被脱库]—数据库的初恋~
- 盘点国内互联网圈中程序员出身的商业大佬,看谁主沉浮!
- 杀手级 AI 补代码工具问世,支持 23 种语言及 5 种主流编辑器,程序员沸腾了...