当前位置:   article > 正文

Qt之自定义界面(窗体缩放)

qt自己实现窗口缩放的思路

简述

通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭。

在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左、上、右、下、左上角、左下角、右上角、右下角时候,鼠标变为相应的样式,并且窗体可以随着鼠标拖动而进行放大、缩小。

效果

这里写图片描述

窗体缩放

实现

首先,设置无边框,用于实现自定义标题栏。

  1. // 设置无边框
  2. setWindowFlags(Qt::FramelessWindowHint);
  3. // 背景透明
  4. setAttribute(Qt::WA_TranslucentBackground, true);
  • 1
  • 2
  • 3
  • 4
  • 5

包含头文件与所需要的库。

  1. #ifdef Q_OS_WIN
  2. #include <qt_windows.h>
  3. #include <Windowsx.h>
  4. #endif
  • 1
  • 2
  • 3
  • 4

使用nativeEvent进行窗体缩放。

注意: m_nBorder表示鼠标位于边框缩放范围的宽度,可以设置为5。

  1. bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
  2. {
  3. Q_UNUSED(eventType)
  4. MSG *param = static_cast<MSG *>(message);
  5. switch (param->message)
  6. {
  7. case WM_NCHITTEST:
  8. {
  9. int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();
  10. int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();
  11. // 如果鼠标位于子控件上,则不进行处理
  12. if (childAt(nX, nY) != NULL)
  13. return QWidget::nativeEvent(eventType, message, result);
  14. *result = HTCAPTION;
  15. // 鼠标区域位于窗体边框,进行缩放
  16. if ((nX > 0) && (nX < m_nBorder))
  17. *result = HTLEFT;
  18. if ((nX > this->width() - m_nBorder) && (nX < this->width()))
  19. *result = HTRIGHT;
  20. if ((nY > 0) && (nY < m_nBorder))
  21. *result = HTTOP;
  22. if ((nY > this->height() - m_nBorder) && (nY < this->height()))
  23. *result = HTBOTTOM;
  24. if ((nX > 0) && (nX < m_nBorder) && (nY > 0)
  25. && (nY < m_nBorder))
  26. *result = HTTOPLEFT;
  27. if ((nX > this->width() - m_nBorder) && (nX < this->width())
  28. && (nY > 0) && (nY < m_nBorder))
  29. *result = HTTOPRIGHT;
  30. if ((nX > 0) && (nX < m_nBorder)
  31. && (nY > this->height() - m_nBorder) && (nY < this->height()))
  32. *result = HTBOTTOMLEFT;
  33. if ((nX > this->width() - m_nBorder) && (nX < this->width())
  34. && (nY > this->height() - m_nBorder) && (nY < this->height()))
  35. *result = HTBOTTOMRIGHT;
  36. return true;
  37. }
  38. }
  39. return QWidget::nativeEvent(eventType, message, result);
  40. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

接口说明

Qt5与Qt4其中的一个区别就是用nativeEvent代替了winEvent。

nativeEvent主要用于进程间通信-消息传递。使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码 - 在mousePressEvent中使用SendMessage来进行移动。

当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。

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

闽ICP备14008679号