需求

  手机模拟器伸缩旋转框架,中间为容器区域预留,给手机模拟器;

 

目标效果

  

 

功能

  1.四个角鼠标图标切换,并且点击可拉伸;
  2.手机框区域,鼠标点击可以拽托;
  3.透明窗口的使用;
  4.横竖屏的切换,,使用F1功能键;

 

原理

  使用QRegion和QRect对鼠标区域进行判断;
  使用QPainter进行绘制;
  使用qss定制按钮样式;
  对QWidget的paintEvent和resizeEvent使用;

 

涉及技术博文

Demo:手机模拟器拉伸旋转框架 v1.0.0

  

 

体验下载地址

  CSDN:https://download.csdn.net/download/qq21497936/12530739
  QQ群:1047134658(点击“文件”搜索“MobileFrame”,群内与博文同步更新)

 

核心代码

MobileWidget.h

  1. #ifndef MOBILEWIDGET_H
  2. #define MOBILEWIDGET_H
  3. #include <QWidget>
  4. #include <QPainter>
  5. #include <QMouseEvent>
  6. namespace Ui {
  7. class MobileWidget;
  8. }
  9. class MobileWidget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. enum DIRECT {
  14. DIRECT_VERTICAL = 0x00,
  15. DIRECT_HORIZONTAL = 0x01,
  16. };
  17. public:
  18. explicit MobileWidget(QWidget *parent = 0);
  19. ~MobileWidget();
  20. protected:
  21. void mousePressEvent(QMouseEvent *event);
  22. void mouseMoveEvent(QMouseEvent *event);
  23. void mouseReleaseEvent(QMouseEvent *event);
  24. void paintEvent(QPaintEvent *event);
  25. void resizeEvent(QResizeEvent *event);
  26. void keyPressEvent(QKeyEvent *event);
  27. protected:
  28. void drawBackground(QPainter *painter);
  29. private:
  30. Ui::MobileWidget *ui;
  31. int _minWidth; // 最小宽度
  32. int _minHeight; // 最小高度
  33. int _radius; // 圆角角度
  34. int _spaceWidth; // 圆角到中间的边框高度
  35. int _borderWidth; // 两边窄边的宽度
  36. int _earY; // 耳机框的y坐标
  37. int _earWidth; // 耳机框的宽度
  38. int _earHeight; // 耳机框的高度
  39. bool _vertical;
  40. QColor _transparentColor; // 四个直角透明区域颜色
  41. QRect _cornerRect1; // 四个圆角区域矩形 1->2->3->4 = 左上->右上->左下->右下
  42. QRect _cornerRect2; // 四个圆角区域矩形
  43. QRect _cornerRect3; // 四个圆角区域矩形
  44. QRect _cornerRect4; // 四个圆角区域矩形
  45. QRect _borderRect1; // 左边界
  46. QRect _borderRect2; // 右边界
  47. QRect _topBorderRect1; // 顶部边框圆角部分
  48. QRect _topBorderRect2; // 顶部边框圆角下部
  49. QRect _bottomBorderRect1; // 底部边框圆角部分
  50. QRect _bottomBorderRect2; // 底部边框圆角上部
  51. QRect _centerRect; // 中心容器区域
  52. QRect _earRect; // 耳机框区域
  53. QRegion _moveRegion; // 鼠标点击可移动的区域
  54. QRegion _stretchRegion1; // 鼠标点击可拉伸的区域
  55. QRegion _stretchRegion2; // 鼠标点击可拉伸的区域
  56. QRegion _stretchRegion3; // 鼠标点击可拉伸的区域
  57. QRegion _stretchRegion4; // 鼠标点击可拉伸的区域
  58. bool _leftButtonPressed; // 鼠标左键按钮
  59. QPoint _beginPoint; // 鼠标左键按钮按下时的坐标
  60. QPoint _leftTopPoint; // 窗口左上角的坐标
  61. bool _stretchRegion1Pressed;// 拉伸按钮区域
  62. bool _stretchRegion2Pressed;// 拉伸按钮区域
  63. bool _stretchRegion3Pressed;// 拉伸按钮区域
  64. bool _stretchRegion4Pressed;// 拉伸按钮区域
  65. QRect _beginRect; // 拉伸开始时的原始窗口
  66. DIRECT _direct; // 方向是水平还是垂直
  67. QRect _buttonRectIcon;
  68. QRect _buttonRectService;
  69. QRect _buttonRectMax;
  70. QRect _buttonRectMin;
  71. QRect _buttonRectExit;
  72. QRect _buttonRectLeft;
  73. QRect _buttonRectMiddle;
  74. QRect _buttonRectRight;
  75. };
  76. #endif // MOBILEWIDGET_H

MobileWidget.cpp

  1. #include "MobileWidget.h"
  2. #include "ui_MobileWidget.h"
  3. #include <QDebug>
  4. MobileWidget::MobileWidget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::MobileWidget),
  7. _minWidth(400),
  8. _minHeight(400),
  9. _radius(50),
  10. _spaceWidth(35),
  11. _borderWidth(3),
  12. _earY(30),
  13. _earWidth(100),
  14. _earHeight(10),
  15. _transparentColor(QColor("#02000000")),
  16. _leftButtonPressed(false),
  17. _stretchRegion1Pressed(false),
  18. _stretchRegion2Pressed(false),
  19. _stretchRegion3Pressed(false),
  20. _stretchRegion4Pressed(false),
  21. _direct(DIRECT::DIRECT_VERTICAL)
  22. {
  23. ui->setupUi(this);
  24. setWindowFlag(Qt::FramelessWindowHint);
  25. setAttribute(Qt::WA_TranslucentBackground);
  26. setMouseTracking(true);
  27. setMinimumSize(_minWidth, _minHeight);
  28. }
  29. MobileWidget::~MobileWidget()
  30. {
  31. delete ui;
  32. }
  33. ...
  34. void MobileWidget::mousePressEvent(QMouseEvent *event)
  35. {
  36. if(event->button() == Qt::LeftButton)
  37. {
  38. if(_moveRegion.contains(event->pos()))
  39. {
  40. _leftButtonPressed = true;
  41. }
  42. if(_stretchRegion1.contains(event->pos()))
  43. {
  44. _stretchRegion1Pressed = true;
  45. }else if(_stretchRegion2.contains(event->pos()))
  46. {
  47. _stretchRegion2Pressed = true;
  48. }else if(_stretchRegion3.contains(event->pos()))
  49. {
  50. _stretchRegion3Pressed = true;
  51. }else if(_stretchRegion4.contains(event->pos()))
  52. {
  53. _stretchRegion4Pressed = true;
  54. }
  55. _beginPoint = QCursor::pos();
  56. _leftTopPoint = geometry().topLeft();
  57. _beginRect = geometry();
  58. }
  59. QWidget::mousePressEvent(event);
  60. }
  61. ...
  62. void MobileWidget::mouseReleaseEvent(QMouseEvent *event)
  63. {
  64. if(event->button() == Qt::LeftButton)
  65. {
  66. _leftButtonPressed = false;
  67. _stretchRegion1Pressed = false;
  68. _stretchRegion2Pressed = false;
  69. _stretchRegion3Pressed = false;
  70. _stretchRegion4Pressed = false;
  71. }
  72. QWidget::mouseReleaseEvent(event);
  73. }
  74. ...
  75. void MobileWidget::keyPressEvent(QKeyEvent *event)
  76. {
  77. if(event->key() == Qt::Key_F1)
  78. {
  79. qDebug() << __FILE__ << __LINE__;
  80. if(_direct == DIRECT_HORIZONTAL)
  81. {
  82. _direct = DIRECT_VERTICAL;
  83. int width = rect().width();
  84. int height = rect().height();
  85. resize(height, width);
  86. }else if(_direct == DIRECT_VERTICAL)
  87. {
  88. _direct = DIRECT_HORIZONTAL;
  89. int width = rect().width();
  90. int height = rect().height();
  91. resize(height, width);
  92. }
  93. }
  94. }
 

项目实战:Qt手机模拟器拉伸旋转框架的更多相关文章

  1. Android项目实战_手机安全卫士splash界面

    - 根据代码的类型组织包结构 1. 界面 com.hb.mobilesafe.activities 2. 服务 com.hb.mobilesafe.services 3. 业务逻辑 com.hb.mo ...

  2. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  3. Android项目实战_手机安全卫士系统加速

    ## 1.本地数据库自动更新的工作机制1. 开启一个服务,定时访问服务器2. 进行版本对比,如果最新版本比较高,获取需要更新的内容3. 将新内容插入到本地数据库中 ## 2.如何处理横竖屏切换1. 指 ...

  4. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析1.界面1.1 黑名单列表界面1.2 添加黑名单界面2.功能2.1 黑名单的添加.删除2.2 拦截电话2.3 拦截短信 ###2.黑名单数据库的创建1.分析需要的字段id 主 ...

  5. MVC + EFCore 项目实战 - 数仓管理系统2- 搭建基本框架配置EFCore

    本次课程就正式进入开发部分. 首先我们先搭建项目框架,还是和之前渐进式风格保持一致,除必备组件外,尽量使用原生功能以方便大家理解. 开发工具:vs 2019 或以上 数据库:SQL SERVER 20 ...

  6. Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags2. 0000 0000 0000 0000 0000 0000 0 ...

  7. Android项目实战_手机安全卫士手机防盗界面

    #安全卫士手机防盗# ###1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作 ###2.Android中的坐标系![](http:/ ...

  8. Android项目实战_手机安全卫士home界面

    # 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...

  9. Android项目实战_手机安全卫士流量统计

    ## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...

随机推荐

  1. Java——异常处理,数据库连接

    在学习数据库连接时看到try(){}结构,查了一下写在这里: import java.sql.Connection; import java.sql.DriverManager; import jav ...

  2. 巧用 display: contents 增强页面语义

    display: contents 是一个比较陌生的属性,虽然属于 display 这个基本上是最常见的 CSS 属性,但是 contents 这个取值基本不会用到.但是它早在 2016 年就已经得到 ...

  3. 【C++】简介

    注意:以下内容摘自文献[1],修改了部分内容. 前言 关于软件产业发展史,不妨访问“首次全面深度解密华为方舟编译器”一文,不仅详细介绍了软件产业的发展,还有华为方舟编译器产生的背景,值得一看! 1. ...

  4. [PHP学习教程 - 文件]001.高速读写大数据“二进制”文件,不必申请大内存(Byte Block)

    引言:读写大“二进制”文件,不必申请很大内存(fopen.fread.fwrite.fclose)!做到开源节流,提高速度! 每天告诉自己一次,『我真的很不错』.... 加速读写大文件,在实际工作过程 ...

  5. 初窥 BB-Framework

     

  6. JavaScript——闭包(转自别人)

    有这样一个段子:说闭包的主要作用是什么?,答:面试.确实在许多面试中,闭包是必问项目,所以不为别的,只为面试,理解闭包就很重要. 说到 闭包 ,这是js不得不提的一个特性,很多传统语言都不具备这样的特 ...

  7. ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作

    前言: 本章主要通过一个完整的示例讲解ASP.NET Core MVC+EF Core对MySQL数据库进行简单的CRUD操作,希望能够为刚入门.NET Core的小伙伴们提供一个完整的参考实例.关于 ...

  8. Chisel3 - util - BitPat

    https://mp.weixin.qq.com/s/80Q8j-OSMtgh5a92pI-MZA   使用value和mask来描述一个比特模式,即:value = bits & mask. ...

  9. Java实现 LeetCode 341 扁平化嵌套列表迭代器

    341. 扁平化嵌套列表迭代器 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另一个列表.其中列表的元素也可能是整数或是其他列 ...

  10. Java实现 LeetCode 316 去除重复字母

    316. 去除重复字母 给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次.需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 1: 输入: " ...