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

实现方法一:

重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大小,或者是拖动界面。思路如上,实现起来很简单。但是存在一个问题,如果界面中放了一些其它控件,比如listWidget,此时鼠标在界面边缘移动速度稍微快一些,mouseMoveEvent就会被子控件截获了,鼠标样式不会改变,对于该方法的这个问题,我还没想到好的解决办法。

实现方法二:

在Qt中处理windows事件,具体实现如下,参考网上一些内容,我顺便修改优化了一下,源代码如下:

#ifndef MBASEWIDGET_H
#define MBASEWIDGET_H #include <QtWidgets/QWidget>
#include "windows.h" class MBaseWidget : public QWidget
{
Q_OBJECT public:
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();//鼠标位置x
int 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中项目属性-链接器中进行相关配置即可。

点击下载

Qt——鼠标拖动调整窗口大小的更多相关文章

  1. qt 鼠标拖动窗口放大缩小

    // 鼠标拖动 具体实现void mouseMoveEvent(QMouseEvent * pEvent) { if (pEvent->buttons() & Qt::LeftButto ...

  2. Qt——鼠标拖动缩放窗口源码

    #ifndef MOVEWIDGET_H #define MOVEWIDGET_H #include <QWidget> #include <QEvent> class Mov ...

  3. qt 鼠标拖动窗口 跳动 解决

    因为获取当前的位置,似乎没有把标题栏的高度记进去. 所以移动前,得考虑到标题栏的高度. 用以下方式获取标题栏高度: QApplication::style()->pixelMetric(QSty ...

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

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

  5. Mac如何让调整窗口大小更简单

    在使用Mac的时候,你能把鼠标的光标悬停在任何程序的边缘,当光标自动变成箭头样式后,按住鼠标左键你将能随意拖动来改变程序窗口的大小.但是,这里有个问题,我们有时候很难控制把鼠标光标移动在正确的窗口边缘 ...

  6. jQuery拖动调整表格列宽度-resizableColumns

    实现鼠标可拖动调整表格列宽度 如图: 一.引入文件: <script src="/js/jquery-1.8.0.min.js" type="text/javasc ...

  7. MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化

    无边框窗体如何实现用鼠标拖动窗体边缘实现窗体大小变动呢?下面介绍一种方法,通过以下几个步骤即可实现: 1.实现WM_NCHITTEST消息,实现四条边框的模拟 2.实现WM_NCLBUTTONDOWN ...

  8. vue 拖动调整左右两侧div的宽度

    原文链接:https://www.cnblogs.com/layaling/p/11009570.html 原文是左中右三种情况的拖动.由于项目需要,我删除掉了右边的,直接左右区域拖动调整div宽度 ...

  9. CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果

    CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果 开始 一图抵千言.首先来看鼠标拖动太阳(光源)的情形. 然后是鼠标拖拽旋转模型的情形. 然后我们移动摄像 ...

随机推荐

  1. iOS屏幕适配知识

    一.旋转处理    第一步:注册通知 [[NSNotificationCenter defaultCenter] addObserver:self                            ...

  2. CocoaPods的使用(图文并茂)OS X 10.11 系统

    系统:OS X EI Capitan 版本:10.11.2 开发工具:XCode:7.2 要使用CocoaPods,那么就需要先安装哦,你安装了么?如果没安装那就请阅读我的前篇<OS X 10. ...

  3. 每日Scrum--No.7

    Yesterday:学习和设计路线的编程 Today:编写代码 Problem:.在设计查询参观路线的时候,整个逻辑特别的混乱,设想了各种树,图以及网的遍历问题,但经过多次与同学的交流以及网上的查询资 ...

  4. java使用this关键字调用本类重载构造器

    在构造器中可以调用本类的其他重载构造器,不能使用构造器名称来调用另一个构造器,而是应该使用Java特定的this(-.)来调用. this(-.)方法必须出现在构造器中的第一行,用来调用其他重载构造器 ...

  5. Android调用Web服务

    现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...

  6. 算法(二)之遗传算法(SGA)

    算法(二)之遗传算法(SGA) 遗传算法(Genetic Algorithm)又叫基因进化算法或进化算法,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,属于启发式搜索算法一种. 下面通过下 ...

  7. [原]openstack-kilo--issue(五) neutron-agent服务实际是active的-但是显示为XXX

    问题出现: 重启后出现了这样的情况: 查看详细的参数 查看数据库neutron 中对应的agents表.发现表中没有alive这个字段 这些服务的实际状态为active: ----1------● n ...

  8. java Memorymapfile demo

    String lineseperator = java.security.AccessController .doPrivileged(new sun.security.action.GetPrope ...

  9. NOIP2011提高组 聪明的质监员 -SilverN

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...

  10. IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法

    IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法 原文链接:http://www.cnblogs.com/200325074/p/3679316.html 今天刚安装好IIS8.5, 我 ...