当前位置:   article > 正文

Qt开发不带标题栏(FramelessWindowHint)的窗体移动及调整大小_qt.framelesswindowhint

qt.framelesswindowhint

C++ Qt是一个基于C++语言的跨平台应用程序开发框架,具有丰富的UI组件和API库。Qt包括了许多模块,如Qt Core、Qt GUI、Qt Network等,每个模块都提供了一系列的类和函数。Qt还提供了集成开发环境(IDE)Qt Creator,使得开发人员可以通过它来创建、编译、调试和部署Qt应用程序。 

学习Qt开发不知道做什么?我为大家整理的这些领域都涉及到Qt开发:嵌入式领域、桌面端开发、移动端、微控制器MCU、客户端(游戏、直播等等)、汽车领域行业、 消费类电子设备、医疗领域行业、工业自动化领域等等

Qt窗体若设置了

setWindowFlags (Qt::FramelessWindowHint);

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

运行后该窗体是无法进行移动和调整大小的,那要如何才能让它和普通窗体一样进行移动和调整其大小的呢?方案如下:

  1. void QFramelessWindow::mousePressEvent(QMouseEvent *event)
  2. {
  3. if (event->button() == Qt::LeftButton) {
  4. this->m_drag = true;
  5. this->dragPos = event->pos();
  6. this->resizeDownPos = event->globalPos();
  7. this->mouseDownRect = this->rect();
  8. }
  9. }
  10. void QFramelessWindow::mouseMoveEvent(QMouseEvent * event)
  11. {
  12. if (resizeRegion != Default)
  13. {
  14. handleResize();
  15. return;
  16. }
  17. if(m_move) {
  18. move(event->globalPos() - dragPos);
  19. return;
  20. }
  21. QPoint clientCursorPos = event->pos();
  22. QRect r = this->rect();
  23. QRect resizeInnerRect(resizeBorderWidth, resizeBorderWidth, r.width() - 2*resizeBorderWidth, r.height() - 2*resizeBorderWidth);
  24. if(r.contains(clientCursorPos) && !resizeInnerRect.contains(clientCursorPos)) { //调整窗体大小
  25. ResizeRegion resizeReg = getResizeRegion(clientCursorPos);
  26. setResizeCursor(resizeReg);
  27. if (m_drag && (event->buttons() & Qt::LeftButton)) {
  28. resizeRegion = resizeReg;
  29. handleResize();
  30. }
  31. }
  32. else { //移动窗体
  33. setCursor(Qt::ArrowCursor);
  34. if (m_drag && (event->buttons() & Qt::LeftButton)) {
  35. m_move = true;
  36. move(event->globalPos() - dragPos);
  37. }
  38. }
  39. }
  40. void QFramelessWindow::mouseReleaseEvent(QMouseEvent *event)
  41. {
  42. m_drag = false;
  43. if(m_move) {
  44. m_move = false;
  45. handleMove(event->globalPos()); //鼠标放开后若超出屏幕区域自动吸附于屏幕顶部/左侧/右侧
  46. }
  47. resizeRegion = Default;
  48. setCursor(Qt::ArrowCursor);
  49. }
  50. void QFramelessWindow::setResizeCursor(ResizeRegion region)
  51. {
  52. switch (region)
  53. {
  54. case North:
  55. case South:
  56. setCursor(Qt::SizeVerCursor);
  57. break;
  58. case East:
  59. case West:
  60. setCursor(Qt::SizeHorCursor);
  61. break;
  62. case NorthWest:
  63. case SouthEast:
  64. setCursor(Qt::SizeFDiagCursor);
  65. break;
  66. default:
  67. setCursor(Qt::SizeBDiagCursor);
  68. break;
  69. }
  70. }
  71. ResizeRegion QFramelessWindow::getResizeRegion(QPoint clientPos)
  72. {
  73. if (clientPos.y() <= resizeBorderWidth) {
  74. if (clientPos.x() <= resizeBorderWidth)
  75. return NorthWest;
  76. else if (clientPos.x() >= this->width() - resizeBorderWidth)
  77. return NorthEast;
  78. else
  79. return North;
  80. }
  81. else if (clientPos.y() >= this->height() - resizeBorderWidth) {
  82. if (clientPos.x() <= resizeBorderWidth)
  83. return SouthWest;
  84. else if (clientPos.x() >= this->width() - resizeBorderWidth)
  85. return SouthEast;
  86. else
  87. return South;
  88. }
  89. else {
  90. if (clientPos.x() <= resizeBorderWidth)
  91. return West;
  92. else
  93. return East;
  94. }
  95. }
  96. void QFramelessWindow::handleMove(QPoint pt)
  97. {
  98. QPoint currentPos = pt - dragPos;
  99. if(currentPos.x()<desktop->x()) { //吸附于屏幕左侧
  100. currentPos.setX(desktop->x());
  101. }
  102. else if (currentPos.x()+this->width()>desktop->width()) { //吸附于屏幕右侧
  103. currentPos.setX(desktop->width()-this->width());
  104. }
  105. if(currentPos.y()<desktop->y()) { //吸附于屏幕顶部
  106. currentPos.setY(desktop->y());
  107. }
  108. move(currentPos);
  109. }
  110. void QFramelessWindow::handleResize()
  111. {
  112. int xdiff = QCursor::pos().x() - resizeDownPos.x();
  113. int ydiff = QCursor::pos().y() - resizeDownPos.y();
  114. switch (resizeRegion)
  115. {
  116. case East:
  117. {
  118. resize(mouseDownRect.width()+xdiff, this->height());
  119. break;
  120. }
  121. case West:
  122. {
  123. resize(mouseDownRect.width()-xdiff, this->height());
  124. move(resizeDownPos.x()+xdiff, this->y());
  125. break;
  126. }
  127. case South:
  128. {
  129. resize(this->width(),mouseDownRect.height()+ydiff);
  130. break;
  131. }
  132. case North:
  133. {
  134. resize(this->width(),mouseDownRect.height()-ydiff);
  135. move(this->x(), resizeDownPos.y()+ydiff);
  136. break;
  137. }
  138. case SouthEast:
  139. {
  140. resize(mouseDownRect.width() + xdiff, mouseDownRect.height() + ydiff);
  141. break;
  142. }
  143. case NorthEast:
  144. {
  145. resize(mouseDownRect.width()+xdiff, mouseDownRect.height()-ydiff);
  146. move(this->x(), resizeDownPos.y()+ydiff);
  147. break;
  148. }
  149. case NorthWest:
  150. {
  151. resize(mouseDownRect.width()-xdiff, mouseDownRect.height()-ydiff);
  152. move(resizeDownPos.x()+xdiff, resizeDownPos.y()+ydiff);
  153. break;
  154. }
  155. case SouthWest:
  156. {
  157. resize(mouseDownRect.width()-xdiff, mouseDownRect.height()+ydiff);
  158. move(resizeDownPos.x()+xdiff, this->y());
  159. break;
  160. }
  161. }
  162. }

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制 

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文的方案还附加了一个自动吸附功能,各位如果不需要的话,可以移除。

附上全局枚举及变量:

  1. enum ResizeRegion
  2. {
  3. Default,
  4. North,
  5. NorthEast,
  6. East,
  7. SouthEast,
  8. South,
  9. SouthWest,
  10. West,
  11. NorthWest
  12. };
  13. bool m_drag, m_move;
  14. QPoint dragPos, resizeDownPos;
  15. const int resizeBorderWidth = 5;
  16. ResizeRegion resizeRegion;
  17. QRect mouseDownRect;

最后郑重提醒:别忘了在构造函数加上这句setMouseTracking(true); 切记切记!!!

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/95184
推荐阅读
相关标签
  

闽ICP备14008679号