// 鼠标拖动 具体实现
void mouseMoveEvent(QMouseEvent * pEvent)
{
if (pEvent->buttons() & Qt::LeftButton)
{
if (resizeDir == nodir)
{//移动窗口
QPoint newPos = pEvent->globalPos(); move(newPos - m_PressedPos); emit signal_drawWidgetPositionChange(this->pos().x(), this->pos().y());
}
else
{
//ptop,pbottom,pleft,pright; //窗口上下左右的值
int ptop = frameGeometry().top();
int pbottom = frameGeometry().bottom();
int pleft = frameGeometry().left();
int pright = frameGeometry().right();
if(resizeDir & top)
{
//检测更改尺寸方向中包含的上下左右分量
if(height() == minimumHeight())
{
ptop = min(pEvent->globalY(),ptop);
}
else if(height() == maximumHeight())
{
ptop = max(pEvent->globalY(),ptop);
}
else
{
ptop = pEvent->globalY();
}
}
else if(resizeDir & bottom)
{
if(height() == minimumHeight())
{
pbottom = max(pEvent->globalY(),ptop);
}
else if(height() == maximumHeight())
{
pbottom = min(pEvent->globalY(),ptop);
}
else
{
pbottom = pEvent->globalY();
}
} if(resizeDir & left)
{ //检测左右分量
if(width() == minimumWidth())
{
pleft = min(pEvent->globalX(),pleft);
}
else if(width() == maximumWidth())
{
pleft = max(pEvent->globalX(),pleft);
}
else
{
pleft = pEvent->globalX();
}
}
else if(resizeDir & right)
{
if(width() == minimumWidth())
{
pright = max(pEvent->globalX(),pright);
}
else if(width() == maximumWidth())
{
pright = min(pEvent->globalX(),pright);
}
else
{
pright = pEvent->globalX();
}
}
//setGeometry(QRect(QPoint(pleft,ptop),QPoint(pright, pbottom))); // 限制大小 if (m_iMaxWindowWidth <= pright - pleft)
{
if (m_iMaxWindowHeight <= pbottom - ptop)
{
setGeometry(QRect(QPoint(pleft,ptop),QPoint(pleft + m_iMaxWindowWidth, ptop + m_iMaxWindowHeight)));
}else
{
setGeometry(QRect(QPoint(pleft,ptop),QPoint(pleft + m_iMaxWindowWidth, pbottom)));
}
}else
{
if (m_iMaxWindowHeight <= pbottom - ptop)
{
setGeometry(QRect(QPoint(pleft,ptop),QPoint(pright, ptop + m_iMaxWindowHeight)));
}else
{
setGeometry(QRect(QPoint(pleft,ptop),QPoint(pright, pbottom)));
}
}
}
}
else
{
findWidgetEdge();
}//当不拖动窗口、不改变窗口大小尺寸的时候 检测鼠标边缘
}

// 计算窗口边缘

void findWidgetEdge()
{
int diffLeft = abs(cursor().pos().x() - frameGeometry().left()); //计算鼠标距离窗口上下左右有多少距离
int diffRight = abs(cursor().pos().x() - frameGeometry().right());
int diffTop = abs(cursor().pos().y() - frameGeometry().top());
int diffBottom = abs(cursor().pos().y() - frameGeometry().bottom()); QCursor tempCursor; //获得当前鼠标样式
tempCursor = cursor(); if(diffTop < m_iEdgeMargin)
{
//根据 边缘距离 分类改变尺寸的方向
if(diffLeft < m_iEdgeMargin)
{
resizeDir = topLeft;
tempCursor.setShape(Qt::SizeFDiagCursor);
}
else if(diffRight < m_iEdgeMargin)
{
resizeDir = topRight;
tempCursor.setShape(Qt::SizeBDiagCursor);
}
else
{
resizeDir = top;
tempCursor.setShape(Qt::SizeVerCursor);
}
}
else if(diffBottom < m_iEdgeMargin)
{
if(diffLeft < m_iEdgeMargin)
{
resizeDir = bottomLeft;
tempCursor.setShape(Qt::SizeBDiagCursor);
}
else if(diffRight < m_iEdgeMargin)
{
resizeDir = bottomRight;
tempCursor.setShape(Qt::SizeFDiagCursor);
}
else
{
resizeDir = bottom;
tempCursor.setShape(Qt::SizeVerCursor);
}
}
else if(diffLeft < m_iEdgeMargin)
{
resizeDir = left;
tempCursor.setShape(Qt::SizeHorCursor);
}
else if(diffRight < m_iEdgeMargin)
{
resizeDir = right;
tempCursor.setShape(Qt::SizeHorCursor);
}
else
{
resizeDir = nodir;
tempCursor.setShape(Qt::ArrowCursor);
} setCursor(tempCursor); //重新设置鼠标,主要是改样式
}
void mouseReleaseEvent(QMouseEvent *)
{
if(resizeDir != nodir)
{ //还原鼠标样式
findWidgetEdge();
}
// this->setCursor(Qt::ArrowCursor);
}
void mousePressEvent(QMouseEvent * pEvent)
{
if (Qt::LeftButton == pEvent->button())
{
this->setCursor(Qt::PointingHandCursor);
m_PressedPos = pEvent->globalPos() - this->pos();
m_dragPosition = pEvent->globalPos() - frameGeometry().topLeft(); //获得鼠标按键位置相对窗口左上面的位置
}
}

qt 鼠标拖动窗口放大缩小的更多相关文章

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

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

  2. Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]

    方法千千万,我只是其中一笔[通过控制PictureBox来控制图片,图片完全施展在控件中]...几久不做,还真有点陌生! 窗体构造中添加鼠标滚动: /// <summary> /// 窗体 ...

  3. 鼠标滚轮图片放大缩小功能,使用layer弹框后不起作用

    今天在项目中遇到的一个问题:点击按钮使用layer弹框弹出一张图片,需要加一个鼠标滚轮放大缩小,图片也跟着放大缩小的功能.于是在网上找了一个demo. DEMO: <!DOCTYPE html ...

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

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

  5. Qt——鼠标拖动调整窗口大小

    要求:鼠标移到界面边角时,鼠标样式相应地发生改变. 实现方法一: 重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大 ...

  6. [Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小

    今天为大家分享的是在Rpg游戏中十分常见的鼠标滚轮调整摄像机视野效果.首先我们先创建一个游戏场景: 接下来我们编写一段脚本代码: [csharp] view plaincopyprint" ...

  7. dephi中单击鼠标拖动窗口(使用WM_SYSCOMMAND)

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Int ...

  8. mxGraph画图区域使用鼠标滚轮实现放大/缩小

    // 重写鼠标滚轮事件 mxEvent.addMouseWheelListener = function (funct) { } // 添加初次载入事件 window.onload = functio ...

  9. [js/jquery]移动端手势拖动,放大,缩小预览图片

    摘要 有这样的需求需要在手机端预览图片的时候,实现图片的手势拖动,放大缩小功能.最终通过touch.js这个插件实现了效果. touch.js Touch.js是移动设备上的手势识别与事件库, 由百度 ...

随机推荐

  1. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  2. 廖雪峰Java10加密与安全-2加密算法-1URL编码

    1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...

  3. 阿里云 Aliplayer高级功能介绍(六):进度条标记

    基本介绍 Aliplayer在进度条上提示时间和缩略图功能外,还可以进行视频内容的提示打点,当然不止是进度条上显示打点的内容,还提供一组接口,方便用户进行打点时间和内容的获取, 基本UI如下图所示: ...

  4. Node.js学习(Node.js基础)

    1.开发环境搭建 v8引擎是作为解析JavaScript程序来运行的 nodejs是一个高性能的,第一个体现在他的JavaScript解析速度很快,v8引擎性能很高,第二个事件驱动和非阻塞 2.全局对 ...

  5. [LOJ#162]模板题-快速幂2

    <题目链接> 注意:这可能也是一道模板题. 注意2:$p=998224352$ 注意3:对于$100\%$的数据,$n\leq 5 \times 10^6$ 这个题很启发思路,如果直接快速 ...

  6. SQL语句中GROUP BY的问题

    今天查询数据库时用到集合函数sum(drp),遇到问题: 百度后,确定如下问题:当select后面查询字段有sum(drp)以外的字段时,必须使用group by函数,对数据进行排序,且查询字段中除s ...

  7. hbase表内存的分布

  8. 2019-2-19-win10-uwp-客户端如何发送类到-asp-dotnet-core-作为参数

    title author date CreateTime categories win10 uwp 客户端如何发送类到 asp dotnet core 作为参数 lindexi 2019-2-19 9 ...

  9. 解决JSP调用JavaBean出现乱码问题

    解决JSP调用JavaBean出现乱码问题 话不多说放代码 144 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style D ...

  10. Prime Ring Problem HDU - 1016 (dfs)

    Prime Ring Problem HDU - 1016 A ring is compose of n circles as shown in diagram. Put natural number ...