Qt 隐藏标题栏可拖拽,自由缩放

举报
DreamLife 发表于 2022/04/14 23:11:24 2022/04/14
【摘要】 Qt在隐藏标题栏的情况下,实现拖拽很简单,可以看这里https://blog.csdn.net/z609932088/article/details/80865742  或者这里:https://blog.csdn.net/z609932088/article/details/50898022   今天主要核心...

Qt在隐藏标题栏的情况下,实现拖拽很简单,可以看这里https://blog.csdn.net/z609932088/article/details/80865742 

或者这里:https://blog.csdn.net/z609932088/article/details/50898022

 

今天主要核心是在几年前,尝试过Qt在隐藏标题栏情况下实现可自由缩放的效果,

原来的坑在这里:https://blog.csdn.net/z609932088/article/details/53929904

今天这坑终于天上了,看下演示效果 参考链接忘记了,浏览记录里面没有找到,如有侵权,联系我

大致就是这样的,剩下的看下代码

 


  
  1. //头文件
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4. #include <QMainWindow>
  5. #include <QPushButton>
  6. #include <QMouseEvent>
  7. #include <QApplication>
  8. #include <QDebug>
  9. enum windowEdge{
  10. TOPLEFT = 11,
  11. TOP = 12,
  12. TOPRIGHT = 13,
  13. LEFT = 21,
  14. CENTER = 22,
  15. RIGHT = 23,
  16. BUTTOMLEFT = 31,
  17. BUTTOM = 32,
  18. BUTTOMRIGHT = 33
  19. };
  20. class MainWindow : public QMainWindow
  21. {
  22. Q_OBJECT
  23. public:
  24. explicit MainWindow(QWidget *parent = nullptr);
  25. signals:
  26. protected:
  27. /**
  28. * @brief mousePressEvent
  29. * @param event
  30. * 鼠标按下事件
  31. */
  32. void mousePressEvent(QMouseEvent *event);
  33. /**
  34. * @brief mouseMoveEvent
  35. * @param event
  36. * 鼠标移动事件
  37. */
  38. void mouseMoveEvent(QMouseEvent *event);
  39. /**
  40. * @brief mouseReleaseEvent
  41. * @param event
  42. * 鼠标松开事件
  43. */
  44. void mouseReleaseEvent(QMouseEvent *event);
  45. /**
  46. * @brief mouseDoubleClickEvent
  47. * @param event
  48. * 鼠标双击事件
  49. */
  50. void mouseDoubleClickEvent(QMouseEvent *event);
  51. /**
  52. * @brief setCursorShape
  53. * @param mPos
  54. * 设置鼠标形状
  55. */
  56. void setCursorShape(int mPos);
  57. /**
  58. * @brief calCursorCol
  59. * @param pt
  60. * @return
  61. * 计算鼠标X的位置
  62. */
  63. int calCursorCol(QPoint pt);
  64. /**
  65. * @brief calCursorPos
  66. * @param pt
  67. * @param colPos
  68. * @return
  69. * 计算鼠标的位置
  70. */
  71. int calCursorPos(QPoint pt,int colPos);
  72. private:
  73. QPoint m_mousePoint; //用于存储鼠标位置
  74. bool m_moveFlag = false; //窗口移动标志位
  75. bool m_resizeFlag = false; //窗口大小重置标志
  76. const int m_titleHight = 30; //用于标记标题栏高度
  77. const int m_frameShape = 2; //用于鼠标区域判断
  78. int m_iCalCursorPos;
  79. QRect m_rtPreGeometry;
  80. QPoint m_ptViewMousePos;
  81. QPushButton *m_pushbuttonClose = nullptr;
  82. };
  83. #endif // MAINWINDOW_H

  
  1. //源文件
  2. #include "mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
  4. {
  5. this->resize(800,600);
  6. this->setWindowFlags(Qt::FramelessWindowHint);
  7. this->setMouseTracking(true);
  8. m_pushbuttonClose = new QPushButton(this);
  9. m_pushbuttonClose->setGeometry(100,100,100,80);
  10. m_pushbuttonClose->setText("关闭");
  11. // m_pushbuttonClose->setStyleSheet();
  12. connect(m_pushbuttonClose,&QPushButton::clicked,this,[=](){this->close();});
  13. }
  14. void MainWindow::mousePressEvent(QMouseEvent *event)
  15. {
  16. if(event->y() < m_titleHight && event->y()> m_frameShape)
  17. {
  18. m_mousePoint = event->globalPos();
  19. m_moveFlag = true;
  20. }
  21. else
  22. {
  23. m_iCalCursorPos = calCursorPos(event->pos(),calCursorCol(event->pos()));
  24. if (event->button() == Qt::LeftButton)
  25. {
  26. if(m_iCalCursorPos != CENTER)
  27. {
  28. m_resizeFlag = true;
  29. }
  30. }
  31. m_rtPreGeometry = geometry();
  32. m_ptViewMousePos = event->globalPos();
  33. }
  34. }
  35. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  36. {
  37. if((event->y() < m_titleHight) && event->y()> m_frameShape && m_moveFlag)
  38. {
  39. int dx = event->globalX() - m_mousePoint.x();
  40. int dy = event->globalY() - m_mousePoint.y();
  41. m_mousePoint = event->globalPos();
  42. this->move(this->x()+dx,this->y()+dy);
  43. }
  44. else
  45. {
  46. if(Qt::WindowMaximized != windowState())
  47. {
  48. setCursorShape(calCursorPos(event->pos(),calCursorCol(event->pos())));
  49. }
  50. QPoint ptCurrentPos = QCursor::pos(); //获取当前的点,这个点是全局的
  51. QPoint ptMoveSize = ptCurrentPos - m_ptViewMousePos; //计算出移动的位置,当前点 - 鼠标左键按下的点
  52. QRect rtTempGeometry = m_rtPreGeometry;
  53. if(m_resizeFlag)
  54. {
  55. switch(m_iCalCursorPos)
  56. {
  57. case windowEdge::TOPLEFT:
  58. rtTempGeometry.setTopLeft(m_rtPreGeometry.topLeft()+ptMoveSize);
  59. break;
  60. case windowEdge::TOP:
  61. rtTempGeometry.setTop(m_rtPreGeometry.top()+ptMoveSize.y());
  62. break;
  63. case windowEdge::TOPRIGHT:
  64. rtTempGeometry.setTopRight(m_rtPreGeometry.topRight()+ptMoveSize);
  65. break;
  66. case windowEdge::LEFT:
  67. rtTempGeometry.setLeft(m_rtPreGeometry.left()+ptMoveSize.x());
  68. break;
  69. case windowEdge::RIGHT:
  70. rtTempGeometry.setRight(m_rtPreGeometry.right()+ptMoveSize.x());
  71. break;
  72. case windowEdge::BUTTOMLEFT:
  73. rtTempGeometry.setBottomLeft(m_rtPreGeometry.bottomLeft()+ptMoveSize);
  74. break;
  75. case windowEdge::BUTTOM:
  76. rtTempGeometry.setBottom(m_rtPreGeometry.bottom()+ptMoveSize.y());
  77. break;
  78. case windowEdge::BUTTOMRIGHT:
  79. rtTempGeometry.setBottomRight(m_rtPreGeometry.bottomRight()+ptMoveSize);
  80. break;
  81. default:
  82. break;
  83. }
  84. this->setGeometry(rtTempGeometry);
  85. }
  86. }
  87. }
  88. void MainWindow::mouseReleaseEvent(QMouseEvent *event)
  89. {
  90. if(event->y() < m_titleHight && event->y()> m_frameShape && m_moveFlag)
  91. {
  92. int dx = event->globalX() - m_mousePoint.x();
  93. int dy = event->globalY() - m_mousePoint.y();
  94. m_mousePoint = event->globalPos();
  95. this->move(this->x()+dx,this->y()+dy);
  96. m_moveFlag = !m_moveFlag;
  97. }
  98. else
  99. {
  100. m_resizeFlag = !m_resizeFlag;
  101. QApplication::restoreOverrideCursor();
  102. }
  103. }
  104. void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
  105. {
  106. if(event->button() == Qt::LeftButton) //鼠标双击最大化/正常
  107. {
  108. if(event->y() < m_titleHight)
  109. {
  110. if(windowState() != Qt::WindowMaximized)
  111. {
  112. this->showMaximized();
  113. }
  114. else
  115. {
  116. this->showNormal();
  117. }
  118. }
  119. }
  120. }
  121. void MainWindow::setCursorShape(int mPos)
  122. {
  123. Qt::CursorShape mCursor;
  124. switch (mPos)
  125. {
  126. case windowEdge::TOPLEFT:
  127. case windowEdge::BUTTOMRIGHT:
  128. mCursor = Qt::SizeFDiagCursor;
  129. break;
  130. case windowEdge::TOPRIGHT:
  131. case windowEdge::BUTTOMLEFT:
  132. mCursor = Qt::SizeBDiagCursor;
  133. break;
  134. case windowEdge::TOP:
  135. case windowEdge::BUTTOM:
  136. mCursor = Qt::SizeVerCursor;
  137. break;
  138. case windowEdge::LEFT:
  139. case windowEdge::RIGHT:
  140. mCursor = Qt::SizeHorCursor;
  141. break;
  142. default:
  143. mCursor = Qt::ArrowCursor;
  144. break;
  145. }
  146. this->setCursor(mCursor);
  147. }
  148. int MainWindow::calCursorCol(QPoint pt)
  149. {
  150. return (pt.x() < m_frameShape ? 1 : ((pt.x() > this->width() - m_frameShape) ? 3 : 2));
  151. }
  152. int MainWindow::calCursorPos(QPoint pt, int colPos)
  153. {
  154. return ((pt.y() < m_frameShape ? 10 : ((pt.y() > this->height() - m_frameShape) ? 30 : 20)) + colPos);
  155. }

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/105710739

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。