Qt实现无边框可以拖拽拉伸

#ifndef FRAMELESS_WINDOW_HPP_
#define FRAMELESS_WINDOW_HPP_
#pragma once#include <QString>
#include <QFile>
#include <QWidget>
#include <QScreen>
#include <QMouseEvent>
#include <QApplication>template <typename T>
class FramelessWindow : public T {public:enum class Direction {UP = 0,DOWN = 1,LEFT,RIGHT,LEFTTOP,LEFTBOTTOM,RIGHTBOTTOM,RIGHTTOP,NONE};FramelessWindow::FramelessWindow(bool translucentBackground, QWidget* parent = Q_NULLPTR): T(parent), m_bLeftPressed(false), m_bResizeable(false), m_bMaximize(false), m_Direction(Direction::NONE), m_iResizeRegionPadding(4) {installEventFilter(this);Qt::WindowFlags flags = windowFlags();setWindowFlags( flags | Qt::FramelessWindowHint);if (translucentBackground) {setAttribute(Qt::WA_TranslucentBackground);}}FramelessWindow::~FramelessWindow() {}void setTitlebar(QVector<QWidget*> titleBar) { m_titlebarWidget = titleBar; }void setResizeable(bool b) { m_bResizeable = b; }bool resizeable() const { return m_bResizeable; }void setAllWidgetMouseTracking(QWidget* widget) {if (!widget)return;widget->setMouseTracking(true);QObjectList list = widget->children();foreach (QObject* obj, list) {if (obj->metaObject()->className() == QStringLiteral("QWidget")) {QWidget* w = (QWidget*)obj;w->setMouseTracking(true);setAllWidgetMouseTracking(w);}}}protected:bool eventFilter(QObject* target, QEvent* event) {if (event->type() == QEvent::Paint) {static bool first = false;if (!false) {first = true;setAllWidgetMouseTracking(this);}}else if (event->type() == QEvent::WindowStateChange) {m_bMaximize = this->windowState() & Qt::WindowMaximized;}return T::eventFilter(target, event);}void mouseDoubleClickEvent(QMouseEvent *event) {if (m_bResizeable) {QWidget* actionWidget = QApplication::widgetAt(event->globalPos());if (actionWidget) {bool inTitlebar = false;for (auto& item : m_titlebarWidget) {if (actionWidget == item) {inTitlebar = true;break;}}if (inTitlebar) {if (m_bMaximize) {this->showNormal();}else {this->showMaximized();}}}}T::mouseDoubleClickEvent(event);}void mousePressEvent(QMouseEvent* event) {if (event->button() == Qt::LeftButton) {if (m_Direction != Direction::NONE) {m_bLeftPressed = true;this->mouseGrabber();}else {QWidget* action = QApplication::widgetAt(event->globalPos());if (action) {bool inTitlebar = false;for (auto& item : m_titlebarWidget) {if (action == item) {inTitlebar = true;break;}}if (inTitlebar) {m_bLeftPressed = true;m_DragPos = event->globalPos() - this->frameGeometry().topLeft();}}}}return T::mousePressEvent(event);}void mouseMoveEvent(QMouseEvent* event) {QPoint globalPoint = event->globalPos();if (m_bLeftPressed) {bool bIgnore = true;QList<QScreen*> screens = QGuiApplication::screens();for (int i = 0; i < screens.size(); i++) {QScreen* pScreen = screens[i];QRect geometryRect = pScreen->availableGeometry();if (geometryRect.contains(globalPoint)) {bIgnore = false;break;}}if (bIgnore) {event->ignore();return;}if (m_Direction != Direction::NONE) {QRect rect = this->rect();QPoint tl = mapToGlobal(rect.topLeft());QPoint rb = mapToGlobal(rect.bottomRight());QRect rMove(tl, rb);switch (m_Direction) {case Direction::LEFT:if (rb.x() - globalPoint.x() <= this->minimumWidth())rMove.setX(tl.x());elserMove.setX(globalPoint.x());break;case Direction::RIGHT:rMove.setWidth(globalPoint.x() - tl.x());break;case Direction::UP:if (rb.y() - globalPoint.y() <= this->minimumHeight())rMove.setY(tl.y());elserMove.setY(globalPoint.y());break;case Direction::DOWN:rMove.setHeight(globalPoint.y() - tl.y());break;case Direction::LEFTTOP:if (rb.x() - globalPoint.x() <= this->minimumWidth())rMove.setX(tl.x());elserMove.setX(globalPoint.x());if (rb.y() - globalPoint.y() <= this->minimumHeight())rMove.setY(tl.y());elserMove.setY(globalPoint.y());break;case Direction::RIGHTTOP:rMove.setWidth(globalPoint.x() - tl.x());rMove.setY(globalPoint.y());break;case Direction::LEFTBOTTOM:rMove.setX(globalPoint.x());rMove.setHeight(globalPoint.y() - tl.y());break;case Direction::RIGHTBOTTOM:rMove.setWidth(globalPoint.x() - tl.x());rMove.setHeight(globalPoint.y() - tl.y());break;default:break;}this->setGeometry(rMove);}else {this->move(event->globalPos() - m_DragPos);event->accept();}}else {region(globalPoint);}return T::mouseMoveEvent(event);}void region(const QPoint& cursorGlobalPoint) {if (!m_bResizeable)return;QRect rect = this->contentsRect();QPoint tl = mapToGlobal(rect.topLeft());QPoint rb = mapToGlobal(rect.bottomRight());int x = cursorGlobalPoint.x();int y = cursorGlobalPoint.y();if (tl.x() + m_iResizeRegionPadding >= x && tl.x() <= x &&tl.y() + m_iResizeRegionPadding >= y && tl.y() <= y) {m_Direction = Direction::LEFTTOP;this->setCursor(QCursor(Qt::SizeFDiagCursor));}else if (x >= rb.x() - m_iResizeRegionPadding && x <= rb.x() &&y >= rb.y() - m_iResizeRegionPadding && y <= rb.y()) {m_Direction = Direction::RIGHTBOTTOM;this->setCursor(QCursor(Qt::SizeFDiagCursor));}else if (x <= tl.x() + m_iResizeRegionPadding && x >= tl.x() &&y >= rb.y() - m_iResizeRegionPadding && y <= rb.y()) {m_Direction = Direction::LEFTBOTTOM;this->setCursor(QCursor(Qt::SizeBDiagCursor));}else if (x <= rb.x() && x >= rb.x() - m_iResizeRegionPadding && y >= tl.y() &&y <= tl.y() + m_iResizeRegionPadding) {m_Direction = Direction::RIGHTTOP;this->setCursor(QCursor(Qt::SizeBDiagCursor));}else if (x <= tl.x() + m_iResizeRegionPadding && x >= tl.x()) {m_Direction = Direction::LEFT;this->setCursor(QCursor(Qt::SizeHorCursor));}else if (x <= rb.x() && x >= rb.x() - m_iResizeRegionPadding) {m_Direction = Direction::RIGHT;this->setCursor(QCursor(Qt::SizeHorCursor));}else if (y >= tl.y() && y <= tl.y() + m_iResizeRegionPadding) {m_Direction = Direction::UP;this->setCursor(QCursor(Qt::SizeVerCursor));}else if (y <= rb.y() && y >= rb.y() - m_iResizeRegionPadding) {m_Direction = Direction::DOWN;this->setCursor(QCursor(Qt::SizeVerCursor));}else {m_Direction = Direction::NONE;this->setCursor(QCursor(Qt::ArrowCursor));}}void mouseReleaseEvent(QMouseEvent* event) {m_bLeftPressed = false;if (m_Direction != Direction::NONE) {m_Direction = Direction::NONE;this->releaseMouse();this->setCursor(QCursor(Qt::ArrowCursor));}return QWidget::mouseReleaseEvent(event);}void resizeEvent(QResizeEvent* event) { return QWidget::resizeEvent(event); }protected:bool m_bLeftPressed;bool m_bResizeable;bool m_bMaximize;Direction m_Direction;const int m_iResizeRegionPadding;QPoint m_DragPos;QVector<QWidget*> m_titlebarWidget;
};static void loadStyleSheetFile(const QString& sheetName, QWidget* widget) {if (widget) {QString qss;QFile qssFile(sheetName);qssFile.open(QFile::ReadOnly);if (qssFile.isOpen()) {qss = QLatin1String(qssFile.readAll());widget->setStyleSheet(qss);qssFile.close();}}
}#endif

使用如下

Qt实现无边框可以拖拽拉伸相关推荐

  1. Qt之QAbstractItemView视图项拖拽(二)

    一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...

  2. AE 超人飞天特效 地面震裂崩飞效果 。SU 可以快速建立模型。室内室外。通过将CAD 的图拖拽 拉伸成面

    今天完成 工资结算发放. 继续TX PDF AE 超人飞天特效  地面震裂崩飞效果 人中枪弹爆头效果 需要相关素材, 比如地面震裂 崩飞 的素材 枪弹 的血液飞溅的素材等 跟踪,动态模糊,快速模糊, ...

  3. vue+element弹窗可拖拽拉伸和弹窗内table高度自适应

    需求是这样的:需要将目前的el-dialog弹窗都改成可拉伸和拖拽的.并且做自适应.(一番交涉下来,最终是如果弹窗里面有table的话,我们给table的高度自适应,普通表单不需要). 确定了需求,准 ...

  4. Qt Quick无边框窗口

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

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

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

  6. vue的拖拽拉伸插件 vue-drag-resize 类似图怪兽的拖拉拽 获取坐标

    下载安装vue-drag-resize yarn add vue-drag-resize 或 npm install vue-drag-resize 在main.js里面全局引入组件 import V ...

  7. GridCard拖拽拉伸卡片(纯JS)

    文章目录 1.使用GridsterJS拖拽卡片问题 2.拖拽卡片网格GridCard功能设计 3.GridCard使用说明 1.使用GridsterJS拖拽卡片问题 在阿里云quickBI上发现它的拖 ...

  8. Qt之无边框设计、鼠标移动窗体、子窗口阴影设计学习

    1)无边框设计代码如下,在构造函数中加入: setWindowFlags(Qt::FramelessWindowHint); //去掉系统边框,设置标志 2)子窗口阴影效果,如下代码: //阴影边框效 ...

  9. Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)

    为用户提供的拖曳功能很直观,在很多桌面应用程序中,复制或移动对象都可以通过拖曳来完成. 基于MIME类型的拖曳数据传输是基于QDrag类的.QMimeData对象将关联的数据与其对应的MIME类型相关 ...

  10. qt下实现文件的拖拽打开

    引言 此文用于记录按下鼠标左键不放,拖动文件到程序中打开.该示例中只设置了可以拖动的文件类型为.h,.cpp,.txt这三种文件类型. 程序运行的效果: 示例 下面是具体的实现. 项目的结构: 具体的 ...

最新文章

  1. 计算机实验书,[计算机软件及应用]实验书.doc
  2. winform groupbox控件放到窗体中间位置
  3. 如何消除运动后肌肉酸痛 (DOMS - Delayed Onset Muscle Soreness)
  4. 数据挖掘介绍以及模型参数详解
  5. 如何让 Mybatis 自动生成代码
  6. [Java基础]反射获取构造方法并使用练习
  7. LeetCode 1088. 易混淆数 II(回溯/BFS)
  8. 张鑫 css,元素有高度 但是css设置背景色不显示
  9. python中yield的使用(两分钟读懂)
  10. 【君思智慧园区】智慧能源综合管理平台,智慧能源管理云平台建设方案!
  11. Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
  12. J2Cache缓存的使用
  13. 元气骑士里面的超级计算机,元气骑士古大陆的神器神威大全
  14. 鱼香肉丝里到底有没有鱼?
  15. layui table动态选中_NeurIPS 2020 | 伯克利新工作: 基于动态关系推理的多智能体轨迹预测问题...
  16. Centos7 源码安装 Apache
  17. RESTful 标准接口教程
  18. liquibase changelog文件
  19. YbtOj#20073. 「NOIP2020 模拟赛 B 组 Day6」钻石守卫
  20. Java8 ConcurrentLinkedQueue和LinkedTransferQueue 源码解析

热门文章

  1. SQL语句 按年龄段分组统计人数
  2. 无人机灯光秀,用到了哪些关键技术?
  3. 文件上传解析器MultipartResolver
  4. python自动化测试登录_自动化测试(二)如何用python写一个用户登陆功能
  5. 【Unity学习】Unity GetCurrentAnimatorStateInfo方法判断动画播放
  6. RecyclerView报错:Scrapped or attached views may not be recycled. isScrap:false isAttached:true
  7. Python机器学习04——惩罚回归
  8. 查看eclipse是多少位
  9. 程序员月薪25000,很可能会掉进这个陷进了!
  10. 织梦图集php,采集功能的使用方法 --- 图片集(一)