项目实战:Qt手机模拟器拉伸旋转框架

简介: 项目实战:Qt手机模拟器拉伸旋转框架

合作案例专栏:案例分享(体验Demo可下载,只定制)

Qt开发专栏:开发技术(点击传送门)


需求

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


目标效果

  


功能

  1.四个角鼠标图标切换,并且点击可拉伸;

  2.手机框区域,鼠标点击可以拽托;

  3.透明窗口的使用;

  4.横竖屏的切换,,使用F1功能键;


原理

  使用QRegion和QRect对鼠标区域进行判断;

  使用QPainter进行绘制;

  使用qss定制按钮样式;

  对QWidget的paintEvent和resizeEvent使用;


涉及技术博文

  《Qt实用技巧:在Qt中获取屏幕的绝对坐标

  《Qt开发技术:Qt绘图系统(一)绘图系统介绍

  《Qt开发技术:Qt绘图系统(二)QPainter详解

  《qss样式表笔记大全(一):qss名词解析(包含相关示例)

  《Qt实用技巧:实现窗口透明的五种方法

  《Qt实用技巧:组合图形的比例变换

  《Qt实用技巧:实现不规则窗口的鼠标消息穿透,包括穿透到桌面和穿透到父窗口


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

  


体验下载地址

  CSDN:https://download.csdn.net/download/qq21497936/12530739

  QQ群:1047134658(点击“文件”搜索“MobileFrame”,群内与博文同步更新)


核心代码

MobileWidget.h

#ifndef MOBILEWIDGET_H
#define MOBILEWIDGET_H
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
namespace Ui {
class MobileWidget;
}
class MobileWidget : public QWidget
{
    Q_OBJECT
public:
    enum DIRECT {
        DIRECT_VERTICAL = 0x00,
        DIRECT_HORIZONTAL = 0x01,
    };
public:
    explicit MobileWidget(QWidget *parent = 0);
    ~MobileWidget();
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);
    void keyPressEvent(QKeyEvent *event);
protected:
    void drawBackground(QPainter *painter);
private:
    Ui::MobileWidget *ui;
    int _minWidth;              // 最小宽度
    int _minHeight;             // 最小高度
    int _radius;                // 圆角角度
    int _spaceWidth;            // 圆角到中间的边框高度
    int _borderWidth;           // 两边窄边的宽度
    int _earY;                  // 耳机框的y坐标
    int _earWidth;              // 耳机框的宽度
    int _earHeight;             // 耳机框的高度
    bool _vertical;
    QColor _transparentColor;   // 四个直角透明区域颜色
    QRect _cornerRect1;         // 四个圆角区域矩形 1->2->3->4 = 左上->右上->左下->右下
    QRect _cornerRect2;         // 四个圆角区域矩形
    QRect _cornerRect3;         // 四个圆角区域矩形
    QRect _cornerRect4;         // 四个圆角区域矩形
    QRect _borderRect1;         // 左边界
    QRect _borderRect2;         // 右边界
    QRect _topBorderRect1;      // 顶部边框圆角部分
    QRect _topBorderRect2;      // 顶部边框圆角下部
    QRect _bottomBorderRect1;   // 底部边框圆角部分
    QRect _bottomBorderRect2;   // 底部边框圆角上部
    QRect _centerRect;          // 中心容器区域
    QRect _earRect;             // 耳机框区域
    QRegion _moveRegion;        // 鼠标点击可移动的区域
    QRegion _stretchRegion1;    // 鼠标点击可拉伸的区域
    QRegion _stretchRegion2;    // 鼠标点击可拉伸的区域
    QRegion _stretchRegion3;    // 鼠标点击可拉伸的区域
    QRegion _stretchRegion4;    // 鼠标点击可拉伸的区域
    bool _leftButtonPressed;    // 鼠标左键按钮
    QPoint _beginPoint;         // 鼠标左键按钮按下时的坐标
    QPoint _leftTopPoint;       // 窗口左上角的坐标
    bool _stretchRegion1Pressed;// 拉伸按钮区域
    bool _stretchRegion2Pressed;// 拉伸按钮区域
    bool _stretchRegion3Pressed;// 拉伸按钮区域
    bool _stretchRegion4Pressed;// 拉伸按钮区域
    QRect _beginRect;           // 拉伸开始时的原始窗口
    DIRECT _direct;             // 方向是水平还是垂直
    QRect _buttonRectIcon;
    QRect _buttonRectService;
    QRect _buttonRectMax;
    QRect _buttonRectMin;
    QRect _buttonRectExit;
    QRect _buttonRectLeft;
    QRect _buttonRectMiddle;
    QRect _buttonRectRight;
};
#endif // MOBILEWIDGET_H

MobileWidget.cpp

#include "MobileWidget.h"
#include "ui_MobileWidget.h"
#include <QDebug>
MobileWidget::MobileWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MobileWidget),
    _minWidth(400),
    _minHeight(400),
    _radius(50),
    _spaceWidth(35),
    _borderWidth(3),
    _earY(30),
    _earWidth(100),
    _earHeight(10),
    _transparentColor(QColor("#02000000")),
    _leftButtonPressed(false),
    _stretchRegion1Pressed(false),
    _stretchRegion2Pressed(false),
    _stretchRegion3Pressed(false),
    _stretchRegion4Pressed(false),
    _direct(DIRECT::DIRECT_VERTICAL)
{
    ui->setupUi(this);
    setWindowFlag(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    setMouseTracking(true);
    setMinimumSize(_minWidth, _minHeight);
}
MobileWidget::~MobileWidget()
{
    delete ui;
}
...
void MobileWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        if(_moveRegion.contains(event->pos()))
        {
            _leftButtonPressed = true;
        }
        if(_stretchRegion1.contains(event->pos()))
        {
            _stretchRegion1Pressed = true;
        }else if(_stretchRegion2.contains(event->pos()))
        {
            _stretchRegion2Pressed = true;
        }else if(_stretchRegion3.contains(event->pos()))
        {
            _stretchRegion3Pressed = true;
        }else if(_stretchRegion4.contains(event->pos()))
        {
            _stretchRegion4Pressed = true;
        }
        _beginPoint = QCursor::pos();
        _leftTopPoint = geometry().topLeft();
        _beginRect = geometry();
    }
    QWidget::mousePressEvent(event);
}
...
void MobileWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        _leftButtonPressed = false;
        _stretchRegion1Pressed = false;
        _stretchRegion2Pressed = false;
        _stretchRegion3Pressed = false;
        _stretchRegion4Pressed = false;
    }
    QWidget::mouseReleaseEvent(event);
}
...
void MobileWidget::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_F1)
    {
        qDebug() << __FILE__ << __LINE__;
        if(_direct == DIRECT_HORIZONTAL)
        {
            _direct = DIRECT_VERTICAL;
            int width = rect().width();
            int height = rect().height();
            resize(height, width);
        }else if(_direct == DIRECT_VERTICAL)
        {
            _direct = DIRECT_HORIZONTAL;
            int width = rect().width();
            int height = rect().height();
            resize(height, width);
        }
    }
}



相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
141 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
7月前
|
开发框架 网络协议 数据库
Qt:构建跨平台应用的强大框架
Qt:构建跨平台应用的强大框架
|
7月前
|
存储
QT图形视图框架绘制曲线图和Smith图
QT图形视图框架绘制曲线图和Smith图
134 0
|
7月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
135 0
|
JSON 搜索推荐 数据库
基于Qt框架实战:MP3音乐播放器搜索引擎
基于Qt框架实战:MP3音乐播放器搜索引擎
基于Qt框架实战:MP3音乐播放器搜索引擎
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
176 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
WK
|
1月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
73 5
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
58 10
|
3月前
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
QT多插件通信框架CTK编译记录
|
7月前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架