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实现可移动和改变尺寸的无边框窗口相关推荐

  1. QT实现完美无边框窗口(可拖动,可调整大小)

    效果如下: 只需定义 nativeEvent 事件即可完成这样的功能 ,但要注意的是,这是通过Windows api实现的. 样例如下:(注意头文件) framelesswidget.h #ifnde ...

  2. Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小

    文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...

  3. Qt Quick无边框窗口

    开发环境:Qt Creator 5.6 内容:  使用 Qt  Quick创建无边框窗口 Qt Quick是一个无比强大.无比方便快捷的跨平台的开发框架,并且能通过Qt强大的元对象系统实现qml与c+ ...

  4. 【C++·Qt】Qt透明无边框窗口以及拖动

    窗口透明  1.窗口整体透明(包含其子空控件) //窗口以及子控件都透明 //setAttribute(Qt::WA_WState_WindowOpacitySet); //网上说直接设置不起作用,需 ...

  5. 【QT】自定义无边框窗口分享

    [QT/天下wu双]自定义无边框窗口分享 https://www.bilibili.com/video/BV1HA411Y7d4 源码链接:https://github.com/Bili-TianX/ ...

  6. Qt第二十七章:QWidget、QMainWindow无边框自定义标题栏并自由移动、缩放、圆角

    前提:UI必須采用自适应布局.  自定义组件[直接CV]custom_components.py # 自定义组件 """ QCustomTitleBar:自定义标题 QW ...

  7. qt 全屏窗口有边框_如何在全屏无边框窗口模式下玩任何Windows游戏

    qt 全屏窗口有边框 If you're a regular PC gamer, you know that playing a game in full screen mode can someti ...

  8. Qt 暗夜黑主题教程(一) 创建带圆角和阴影的无边框窗口

    创建项目 创建一个主窗口为 QWidget 类.带 UI样式表的项目.我的项目名叫 NightDark,窗口类名叫 Widget,刚入门的小白可以跟我命名保持一致方便学习,大佬自便.(不对,大佬怎么来 ...

  9. 火山PC无边框窗口尺寸的调整方法教程

    一.配置模块 右键配置模块,勾选"火山模块" 二.窗口布局 三.窗口事件 四.标签事件 五.演示 例子下载:点击本链接

最新文章

  1. SVM算法在项目实践中的应用!
  2. 苹果终端date命令_mac 终端 常用命令
  3. 基于通用权限管理系统实现的单点登录
  4. JAVA基础:JDK、JRE、JVM的概念
  5. 如何设计一条稳定的应用交付流程?|云效工程师指北
  6. 五大服务顺序_百度大脑5.0技术干货:详解飞桨五大优势,鸿鹄芯片架构细节
  7. Hadoop技术内幕:深入解析YARN架构设计与实现原理pdf
  8. [转载] Netty
  9. PCA9685 多舵机控制器的编程
  10. 录入数学公式至mark down文档的方法
  11. Java中关于创建文件,Java实现 PDF、Word、Excel、Html、XML互转及与图片互相转化、图片像素调节,待更新整理中
  12. 福昕阅读器注册无法连接服务器,福昕pdf阅读器 10安装使用教程(附注册机)
  13. PID原理(图形并茂)
  14. scp传输 ssh: connect to host port 22: Connection refused终极解决 vps
  15. 样本均值,顺序统计量,样本中位数, 样本方差,样本标准差,直方图,核密度估计曲线,经验分布函数图,箱形图;matlab实现
  16. 达芬奇密码 第八十五章
  17. 网站遭到恶意攻击有什么危害
  18. SysDVR Switch 串流到笔记本
  19. eq值 推荐算法_EQ均衡器的算法,你知道多少?
  20. 飞蛾云小票打印API,以及小票模板函数

热门文章

  1. jQuery源码学习之五 (jQUery继承方法)
  2. SQL存储过程与自定义函数实例
  3. 7.Springcloud的Ribbon的自定义算法实现
  4. matlab predict函数并行,Matalb 智能算法第29个案例运行报错问题
  5. mysql ext_RHEL5+postfix+mysql+extmai(源代码)(一)
  6. Spring MVC的表单标签库详解
  7. 免费linux 脚本,替换xshell,说一下一些免费的shell工具
  8. python3最新版下载_python3.9下载-Python下载v3.9.0 官方最新版【x86|x64】-西西软件下载...
  9. 做前端开发,30 岁前能买上房子吗?
  10. 前端开发者正在被迫成为全栈开发人员