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(); //获得鼠标按键位置相对窗口左上面的位置 } }
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!


作者:风来风往风伤
出处:http://www.cnblogs.com/amwuau/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2016-12-22 JSP在项目中的路径问题
2016-12-22 JSP页面显示乱码
2016-12-22 表单提交中文时出现乱码
2016-12-22 jsp数据库连接出现乱码
2016-12-22 数据库的显示乱码
2016-12-22 JSP中文乱码问题解决方法小结
2016-12-22 JSP/Servlet 中的汉字编码问题