效果如下:

只需定义 nativeEvent 事件即可完成这样的功能 ,但要注意的是,这是通过Windows api实现的。

样例如下:(注意头文件)

framelesswidget.h

#ifndef FRAMELESSWIDGET_H
#define FRAMELESSWIDGET_H#include <QWidget>
#include <windows.h>        //注意头文件
#include <windowsx.h>
#include <QMouseEvent>
class FramelessWidget : public QWidget
{Q_OBJECTpublic:FramelessWidget(QWidget *parent = 0);~FramelessWidget();
protected:bool nativeEvent(const QByteArray &eventType, void *message, long *result);void mousePressEvent(QMouseEvent *e);void mouseMoveEvent(QMouseEvent *e);
private:int boundaryWidth;QPoint clickPos;
};#endif // FRAMELESSWIDGET_H

framelesswidget.cpp

#include "framelesswidget.h"FramelessWidget::FramelessWidget(QWidget *parent): QWidget(parent)
{boundaryWidth=4;                                    //设置触发resize的宽度this->setWindowFlags(Qt::FramelessWindowHint);      //设置为无边框窗口this->setMinimumSize(45,45);                        //设置最小尺寸this->setStyleSheet("background:#D1EEEE");          //设置背景颜色
}
FramelessWidget::~FramelessWidget()
{}bool FramelessWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG* msg = (MSG*)message;   switch(msg->message){case WM_NCHITTEST:int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();if(xPos < boundaryWidth && yPos<boundaryWidth)                    //左上角*result = HTTOPLEFT;else if(xPos>=width()-boundaryWidth&&yPos<boundaryWidth)          //右上角*result = HTTOPRIGHT;else if(xPos<boundaryWidth&&yPos>=height()-boundaryWidth)         //左下角*result = HTBOTTOMLEFT;else if(xPos>=width()-boundaryWidth&&yPos>=height()-boundaryWidth)//右下角*result = HTBOTTOMRIGHT;else if(xPos < boundaryWidth)                                     //左边*result =  HTLEFT;else if(xPos>=width()-boundaryWidth)                              //右边*result = HTRIGHT;else if(yPos<boundaryWidth)                                       //上边*result = HTTOP;else if(yPos>=height()-boundaryWidth)                             //下边*result = HTBOTTOM;else              //其他部分不做处理,返回false,留给其他事件处理器处理return false;return true;}return false;         //此处返回false,留给其他事件处理器处理
}void FramelessWidget::mousePressEvent(QMouseEvent *e)
{if(e->button()==Qt::LeftButton)clickPos=e->pos();
}
void FramelessWidget::mouseMoveEvent(QMouseEvent *e)
{if(e->buttons()&Qt::LeftButton)move(e->pos()+pos()-clickPos);
}

main.cpp

#include "framelesswidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);FramelessWidget w;w.show();return a.exec();
}

QT实现完美无边框窗口(可拖动,可调整大小)相关推荐

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

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

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

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

  3. 最简单的方式实现QML无边框窗口边缘拖动调整大小

    前言 使用Qt在开发桌面程序时,通常会去除默认的程序边框,从而实现自定义的标题栏.然而当设置窗口属性为Qt.FramelessWindowHint后,窗口的拖动,以及在边缘拖动缩放的功能就没有了,在以 ...

  4. QT实现可移动和改变尺寸的无边框窗口

    2019独角兽企业重金招聘Python工程师标准>>> 实现QT无边框窗口的拖动,尺寸改变.需要的时候从该类继承,派生类需要定义为QWidget. 头文件: #ifndef SIZE ...

  5. Qt Quick无边框窗口

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

  6. qt禁止拖动_[Qt]QMdiArea,无框架窗口的拖动

    0:QMdiArea中添加子窗口后,想固定or调整窗口的大小 需要在addSubWindow()函数调用后返回子窗口的指针,然后再设置子窗口的大小 注意设置imagelabel的大小是没有效果的,im ...

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

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

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

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

  9. [乱说]Electron 无边框窗口最大化最小化关闭功能

    title: '[乱说]Electron 无边框窗口最大化最小化关闭功能' date: 2017-11-21 21:43:40 tags: Electron 无边框窗口最大化最小化关闭功能 目的 实现 ...

最新文章

  1. cnpm与npm指定有什么区别?
  2. eth显卡算力2020最新排行_最新三大主流币IPFS比特币ETH挖矿全网算力动态速递单周报(12.3更新)...
  3. 系统滚动条实现的NUD控件Unusable版
  4. Batch Normalization原理及pytorch的nn.BatchNorm2d函数
  5. JavaScript变量提升
  6. php运行时输出,在PHP中运行具有实时输出的过程
  7. 左耳朵耗子:聊聊分布式系统架构
  8. javashop 发布开源放大镜HiZoom插件
  9. python win32com 批量加密excel 新增sheet 调整sheet顺序
  10. android 测试 内存,Android性能测试之内存(二)
  11. “弹出DVD驱动器错误”解决方法
  12. 论文中常用的对word页眉页脚的操作
  13. Brat中文标注工具的使用
  14. window.btoa与window.atob
  15. 自制汉字字库,识别汉字(一)(数字篇)
  16. 工业通讯 | Profinet协议基础知识(三)
  17. DSPE-PEG-DBCO 磷脂-聚乙二醇-二苯并环辛炔 一种线性杂双官能聚乙二醇化试剂
  18. GPS研究---GPS 系统的组成
  19. AI取代会议同传,还需几步?
  20. 武威世纪计算机英语作文,我的城市武威英语作文

热门文章

  1. Springboot中属性文件的加载和生效顺序
  2. python赋值布尔变量_python基础 - 变量、布尔值、运算符、条件及循环语句
  3. php 正则匹配乱码,php正则匹配utf-8编码的中文汉字
  4. SQL进行特殊符号的替换
  5. php date函数季度天数,php 日期_PHP的日期 date 函数
  6. 没有天赋能做设计吗?看优秀设计师必做的5件成功事...
  7. 区块链的技术简史与未来前景,从互联网进化角度分析
  8. 纯净精品:龙行天下技术GHOST XP SP3快速装机VIP特供版 2010年7月B版
  9. Windows 无法删除文件夹 —— 访问被拒绝 / 因为目录不是空的(转载)
  10. 造成死机的硬件有哪些?CPU风扇正常的转速是多少?