QT实现可移动和改变尺寸的无边框窗口
2019独角兽企业重金招聘Python工程师标准>>>
实现QT无边框窗口的拖动,尺寸改变。需要的时候从该类继承,派生类需要定义为QWidget。
头文件:
#ifndef SIZEABLEWIDGET_H
#define SIZEABLEWIDGET_H#include <QWidget>class SizeableWidget : public QWidget
{Q_OBJECT
public:SizeableWidget(QWidget *parent = 0);//允许或禁止移动bool isMoveable()const;void setMoveable(bool moveable);//允许或禁止改变大小bool isSizeable()const;void setSizeable(bool sizeable);private:void mousePressEvent (QMouseEvent* event);void mouseReleaseEvent(QMouseEvent* event);void mouseMoveEvent(QMouseEvent* event);int calcPosition(const QPoint& pt);void setCursorType(int value);private:bool m_bMoveable;bool m_bSizeable;bool m_bLeftMouseButtonPressed;int m_lastPosition;QPoint m_ptLast;Qt::CursorShape m_currentCursor;
};#endif // SIZEABLEWIDGET_H
源文件:
#include "sizeablewidget.h"
#include <QPainter>
#include <QMouseEvent>namespace
{const int g_padding = 4;int helperCalcPosition(int pos, int range){return (pos < g_padding) ? 0 : ((pos > (range - g_padding)) ? 2 : 1);}
}SizeableWidget::SizeableWidget(QWidget *parent) :QWidget(parent) ,m_bMoveable(true) ,m_bSizeable(true) ,m_bLeftMouseButtonPressed(false) ,m_lastPosition(11) ,m_currentCursor(Qt::ArrowCursor)
{setCursor(m_currentCursor);setMinimumSize(QSize(32, 32));
}bool SizeableWidget::isMoveable()const
{return m_bMoveable;
}void SizeableWidget::setMoveable(bool moveable)
{m_bMoveable = moveable;
}bool SizeableWidget::isSizeable()const
{return m_bSizeable;
}void SizeableWidget::setSizeable(bool sizeable)
{m_bSizeable = sizeable;
}int SizeableWidget::calcPosition(const QPoint& pt)
{int row = helperCalcPosition(pt.y(), rect().height());int col = helperCalcPosition(pt.x(), rect().width());return row * 10 + col;
}void SizeableWidget::mousePressEvent(QMouseEvent* event)
{m_bLeftMouseButtonPressed = true;m_ptLast = event->globalPos();m_lastPosition = calcPosition(event->pos());QWidget::mousePressEvent(event);
}void SizeableWidget::mouseReleaseEvent(QMouseEvent* event)
{m_bLeftMouseButtonPressed = false;QWidget::mouseReleaseEvent(event);
}void SizeableWidget::mouseMoveEvent(QMouseEvent* event)
{if(m_bLeftMouseButtonPressed){QPoint ptNew = event->globalPos();ptNew -= m_ptLast;if(11 == m_lastPosition) //拖动{if (m_bMoveable){ptNew += pos();move(ptNew);}}else //调整大小{if (m_bSizeable){QRect rectWindow = geometry();switch(m_lastPosition){case 00:rectWindow.setTopLeft(rectWindow.topLeft() + ptNew);break;case 02:rectWindow.setTopRight(rectWindow.topRight() + ptNew);break;case 20:rectWindow.setBottomLeft(rectWindow.bottomLeft() + ptNew);break;case 22:rectWindow.setBottomRight(rectWindow.bottomRight() + ptNew);break;case 10:rectWindow.setLeft(rectWindow.left() + ptNew.x());break;case 12:rectWindow.setRight(rectWindow.right() + ptNew.x());break;case 01:rectWindow.setTop(rectWindow.top() + ptNew.y());break;case 21:rectWindow.setBottom(rectWindow.bottom() + ptNew.y());break;default:Q_ASSERT(0);}setGeometry(rectWindow);}}m_ptLast = event->globalPos();}else{if (m_bSizeable)setCursorType(calcPosition(event->pos()));}QWidget::mouseMoveEvent(event);
}void SizeableWidget::setCursorType(int value)
{Qt::CursorShape cursor;switch(value){case 00:case 22:cursor = Qt::SizeFDiagCursor;break;case 02:case 20:cursor = Qt::SizeBDiagCursor;break;case 10:case 12:cursor = Qt::SizeHorCursor;break;case 01:case 21:cursor = Qt::SizeVerCursor;break;case 11:cursor = Qt::ArrowCursor;break;default:Q_ASSERT(0);break;}if(cursor != m_currentCursor){m_currentCursor = cursor;setCursor(m_currentCursor);}
}
转载于:https://my.oschina.net/u/3489228/blog/1503487
QT实现可移动和改变尺寸的无边框窗口相关推荐
- QT实现完美无边框窗口(可拖动,可调整大小)
效果如下: 只需定义 nativeEvent 事件即可完成这样的功能 ,但要注意的是,这是通过Windows api实现的. 样例如下:(注意头文件) framelesswidget.h #ifnde ...
- Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小
文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...
- Qt Quick无边框窗口
开发环境:Qt Creator 5.6 内容: 使用 Qt Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...
- 【C++·Qt】Qt透明无边框窗口以及拖动
窗口透明 1.窗口整体透明(包含其子空控件) //窗口以及子控件都透明 //setAttribute(Qt::WA_WState_WindowOpacitySet); //网上说直接设置不起作用,需 ...
- 【QT】自定义无边框窗口分享
[QT/天下wu双]自定义无边框窗口分享 https://www.bilibili.com/video/BV1HA411Y7d4 源码链接:https://github.com/Bili-TianX/ ...
- Qt第二十七章:QWidget、QMainWindow无边框自定义标题栏并自由移动、缩放、圆角
前提:UI必須采用自适应布局. 自定义组件[直接CV]custom_components.py # 自定义组件 """ QCustomTitleBar:自定义标题 QW ...
- qt 全屏窗口有边框_如何在全屏无边框窗口模式下玩任何Windows游戏
qt 全屏窗口有边框 If you're a regular PC gamer, you know that playing a game in full screen mode can someti ...
- Qt 暗夜黑主题教程(一) 创建带圆角和阴影的无边框窗口
创建项目 创建一个主窗口为 QWidget 类.带 UI样式表的项目.我的项目名叫 NightDark,窗口类名叫 Widget,刚入门的小白可以跟我命名保持一致方便学习,大佬自便.(不对,大佬怎么来 ...
- 火山PC无边框窗口尺寸的调整方法教程
一.配置模块 右键配置模块,勾选"火山模块" 二.窗口布局 三.窗口事件 四.标签事件 五.演示 例子下载:点击本链接
最新文章
- SVM算法在项目实践中的应用!
- 苹果终端date命令_mac 终端 常用命令
- 基于通用权限管理系统实现的单点登录
- JAVA基础:JDK、JRE、JVM的概念
- 如何设计一条稳定的应用交付流程?|云效工程师指北
- 五大服务顺序_百度大脑5.0技术干货:详解飞桨五大优势,鸿鹄芯片架构细节
- Hadoop技术内幕:深入解析YARN架构设计与实现原理pdf
- [转载] Netty
- PCA9685 多舵机控制器的编程
- 录入数学公式至mark down文档的方法
- Java中关于创建文件,Java实现 PDF、Word、Excel、Html、XML互转及与图片互相转化、图片像素调节,待更新整理中
- 福昕阅读器注册无法连接服务器,福昕pdf阅读器 10安装使用教程(附注册机)
- PID原理(图形并茂)
- scp传输 ssh: connect to host port 22: Connection refused终极解决 vps
- 样本均值,顺序统计量,样本中位数, 样本方差,样本标准差,直方图,核密度估计曲线,经验分布函数图,箱形图;matlab实现
- 达芬奇密码 第八十五章
- 网站遭到恶意攻击有什么危害
- SysDVR Switch 串流到笔记本
- eq值 推荐算法_EQ均衡器的算法,你知道多少?
- 飞蛾云小票打印API,以及小票模板函数
热门文章
- jQuery源码学习之五 (jQUery继承方法)
- SQL存储过程与自定义函数实例
- 7.Springcloud的Ribbon的自定义算法实现
- matlab predict函数并行,Matalb 智能算法第29个案例运行报错问题
- mysql ext_RHEL5+postfix+mysql+extmai(源代码)(一)
- Spring MVC的表单标签库详解
- 免费linux 脚本,替换xshell,说一下一些免费的shell工具
- python3最新版下载_python3.9下载-Python下载v3.9.0 官方最新版【x86|x64】-西西软件下载...
- 做前端开发,30 岁前能买上房子吗?
- 前端开发者正在被迫成为全栈开发人员