qt 鼠标拖动窗口放大缩小
// 鼠标拖动 具体实现
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 鼠标拖动窗口放大缩小的更多相关文章
- qt 鼠标拖动窗口 跳动 解决
因为获取当前的位置,似乎没有把标题栏的高度记进去. 所以移动前,得考虑到标题栏的高度. 用以下方式获取标题栏高度: QApplication::style()->pixelMetric(QSty ...
- Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]
方法千千万,我只是其中一笔[通过控制PictureBox来控制图片,图片完全施展在控件中]...几久不做,还真有点陌生! 窗体构造中添加鼠标滚动: /// <summary> /// 窗体 ...
- 鼠标滚轮图片放大缩小功能,使用layer弹框后不起作用
今天在项目中遇到的一个问题:点击按钮使用layer弹框弹出一张图片,需要加一个鼠标滚轮放大缩小,图片也跟着放大缩小的功能.于是在网上找了一个demo. DEMO: <!DOCTYPE html ...
- Qt——鼠标拖动缩放窗口源码
#ifndef MOVEWIDGET_H #define MOVEWIDGET_H #include <QWidget> #include <QEvent> class Mov ...
- Qt——鼠标拖动调整窗口大小
要求:鼠标移到界面边角时,鼠标样式相应地发生改变. 实现方法一: 重写mouseMoveEvent,如果鼠标没有按下,则根据鼠标在界面上的位置设置鼠标样式,如果鼠标按下,则根据位置判断该怎样调整界面大 ...
- [Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小
今天为大家分享的是在Rpg游戏中十分常见的鼠标滚轮调整摄像机视野效果.首先我们先创建一个游戏场景: 接下来我们编写一段脚本代码: [csharp] view plaincopyprint" ...
- dephi中单击鼠标拖动窗口(使用WM_SYSCOMMAND)
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Int ...
- mxGraph画图区域使用鼠标滚轮实现放大/缩小
// 重写鼠标滚轮事件 mxEvent.addMouseWheelListener = function (funct) { } // 添加初次载入事件 window.onload = functio ...
- [js/jquery]移动端手势拖动,放大,缩小预览图片
摘要 有这样的需求需要在手机端预览图片的时候,实现图片的手势拖动,放大缩小功能.最终通过touch.js这个插件实现了效果. touch.js Touch.js是移动设备上的手势识别与事件库, 由百度 ...
随机推荐
- MYSQL错误代码和消息
服务器错误信息来自下述源文件: · 错误消息信息列在share/errmsg.txt文件中.“%d”和“%s”分别代表编号和字符串,显示时,它们将被消息值取代. · 错 ...
- webpack:Cannot find module 'extract-text-webpack-plugin'
问题: 在终端中使用此命令安装了extract-text-webpack-plugin,npm install -g extract-text-webpack-plugin并在webpack.conf ...
- 阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务
1.HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎.Ganos已作为云数据库时空引擎与数据库平台融合,建立了以自研云原生数据库POALRDB为基础,联合NoSQL大数据 ...
- PHP获取网站中各文章的第一张图片的代码示例
调取文章中的第一张图作为列表页缩略图是很流行的做法,WordPress中一般主题默认也是如此,那我们接下来就一起来看看PHP获取网站中各文章的第一张图片的代码示例 ? 1 2 3 4 5 6 7 8 ...
- jeecms 链接标签
.引入页面 [#include "../include/header-site.html"/]12.导航栏只有前两个带链接 [#if c_index<2] href=&quo ...
- SignalR 2.0 入门与提高 转载https://www.cnblogs.com/vance/p/SignalR.html
SignalR 2.0 最近整理了SignalR2.0 部分知识点,原文翻译,由于自己是土鳖,翻译得不好的地方,欢迎指正!仅供各位初学者学习! 第一节. 入门ASP.NET SignalR2.0 1. ...
- 关于apache kylin 安装32位linux办法
最近公司在使用apache kylin做实时开发访问,但是自己集群是linux32 只能安装JDK32位的受限只能3G多内存,而apachekylin 默认是4G内存,需要JDK64位支持. 解决办法 ...
- 嘴巴题2 UVA10779 收集者的难题
UVA10779 收集者的难题 题目: 有\(T(T\leq 20)\)组数据.\(Bob\)在与他的\(n−1(2\leq n\leq 10)个\)朋友交换糖纸,一共有\(m(5\leq m\leq ...
- Luogu P1530 分数化小数 Fractions to Decimals(模拟)
P1530 分数化小数 Fractions to Decimals 题意 题目描述 写一个程序,输入一个形如\(N/D\)的分数(\(N\)是分子,\(D\)是分母),输出它的小数形式.如果小数有循环 ...
- C++11的for循环的新用法
字符串 string str = "this is a string"; for(auto ch : str) cout << ch << endl; 等价 ...