要求:鼠标移到界面边角时,鼠标样式相应地发生改变。

实现方法一:

重写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——鼠标拖动调整窗口大小相关推荐

  1. 【QT 5 设置自定义标题栏+学习:《QT实现鼠标拖动调整窗口大小》+基础样例】

    [QT 5 设置自定义标题栏+学习:<QT实现鼠标拖动调整窗口大小>+基础样例] 1.说明 2.实验环境 3.实验目的 4.参考文章 5.实验步骤 (1)下载代码,运行没有错误. (2)加 ...

  2. Qt鼠标拖动绘制基本几何图形

    概述 用Qt鼠标事件实现基本几何图形的绘制,支持直线.矩形.圆形.椭圆.后期可以在此基础上进行扩展. 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独 ...

  3. Python使用鼠标滚轮调整tkinter应用程序窗口大小

    图书推荐: <Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等 ...

  4. python tkinter获取屏幕大小_Python使用鼠标滚轮调整tkinter应用程序窗口大小

    图书推荐:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情:用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等配套 ...

  5. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  6. vimrc配置 鼠标光标_在“提示”框中:即时调整窗口大小,包含鼠标光标并了解电池配置...

    vimrc配置 鼠标光标 Every week we dip into the reader mail bag and pull out tips and tricks to share. This ...

  7. OS X 使用技巧——轻松地调整窗口大小

    如果你想调整窗口大小,只需要把鼠标指针悬停在窗口边框上.当它变成双向箭头时,点击并拖动鼠标即可完成这一操作. 但在实际操作中,迅速把鼠标指针定位到边框上比较困难. 解决的办法是:在终端输入以下命令: ...

  8. windows调整窗口大小_175 Windows 7调整,提示和操作方法文章

    windows调整窗口大小 Windows 7 is being officially released on October 22nd, which also happens to be today ...

  9. QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等

    QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等 框架搭建 UI设计 mp3.h mp3.cpp 隐藏窗口标题 最大化 最小化 关闭 框架搭建 .p ...

最新文章

  1. 工作几天被裁员,难受
  2. Cloud一分钟 | 苹果更新“隐私页面”;中国联通大数据正式升级,进入数智新阶段...
  3. ajax结合接口 分页插件
  4. v-for和v-if同时使用(案例分析:循环最新的前14条数据显示) - 踩坑篇
  5. 心中无敌,则天下无敌
  6. dz中footer.php在哪找,去掉DZ顶部标题,美化底部左下方版权,详细教程
  7. 联通微服务怎么还款_重磅!中国联通推出微信签约代扣新功能
  8. 24-思科防火墙:ASA透明防火墙实验
  9. 银耳椰椰——Alpha冲刺Day09
  10. win7系统域服务器,win7安装域服务器
  11. OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧
  12. php 公众平台开发教程,微信公众平台开发入门教程
  13. 华三交换机升级的ipe文件_H3C交换机升级步骤
  14. 《黑白团团队》第八次团队作业:Alpha冲刺 第一天
  15. 纯html5的树形菜单,一个简单的js树形菜单
  16. 深入理解金融交易报文Iso8583协议
  17. FileSystemWatcher 基础用法
  18. 针对严峻的网络安全环境,公司就当如何应对?
  19. 计算机又坏了,第二次回家
  20. 清除系统垃圾的bat文件

热门文章

  1. python中dom模块_Python中使用dom模块生成XML文件示例
  2. 【若依(ruoyi)】解决同一Tomcat下两个/多个若依(ruoyi)项目部署报错
  3. Ubuntu连接WiFi
  4. bootstraptable 汇总_bootstrap-table事件汇总
  5. python把字符串转化为字典_python 将字符串转换成字典dict的各种方式总结
  6. ubuntu查看默认python版本_ubuntu中修改默认Python版本号
  7. mysql事务提交模式
  8. [别被脱库]—数据库的初恋~
  9. 盘点国内互联网圈中程序员出身的商业大佬,看谁主沉浮!
  10. 杀手级 AI 补代码工具问世,支持 23 种语言及 5 种主流编辑器,程序员沸腾了...