Qt-不规则窗口
1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=44
实现效果如下:

图片背景透明,可通过鼠标左键拖动图片(移动时以左上角为坐标),右键关闭。
2 代码及实现说明
我们需要实现的部分主要有:
(1)去掉窗口边框,并把窗口背景设置为透明;
1 //去窗口边框
2 setWindowFlags(Qt::FramelessWindowHint | windowFlags());
3 //把窗口背景设置为透明
4 setAttribute(Qt::WA_TranslucentBackground);
(2)实现绘图事件函数paintEvent()
1 void Widget::paintEvent(QPaintEvent *event)
2 {
3 QPainter p(this);
4 p.drawPixmap(0, 0, QPixmap("../image/sunny.png"));
5 }
(3)实现鼠标按下事件mousePressEvent()
1 void Widget::mousePressEvent(QMouseEvent *event)
2 {
3 if (event->button() == Qt::RightButton) {
4 //如果是右键
5 close();
6 } else if (event->button() == Qt::LeftButton) {
7 //求坐标差值
8 //当前点击坐标-窗口左下角坐标
9 p = event->globalPos() - this->frameGeometry().topLeft();
10 }
11 }
(4)实现鼠标移动事件mouseMoveEvent()
1 void Widget::mouseMoveEvent(QMouseEvent *event)
2 {
3 if (event->buttons() & Qt::LeftButton) {
4 move(event->globalPos() - p);
5 }
6 }
说一下按下鼠标左键,如何计算出移动窗口的坐标的。
globalPos()函数获取的是全局的位置(从整个显示器的左上角计算的),this->frameGeometry().topLeft()获取的是相对于打开窗口的左上角的坐标,它们相减就可以得到打开窗口的左上角相对于整个屏幕的坐标,我们移动窗口时也是以这个坐标来移动的。
(5)完整的代码
widget.cpp

1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QPainter>
4 #include <QMouseEvent>
5
6 Widget::Widget(QWidget *parent) :
7 QWidget(parent),
8 ui(new Ui::Widget)
9 {
10 ui->setupUi(this);
11
12 //去窗口边框
13 setWindowFlags(Qt::FramelessWindowHint | windowFlags());
14 //把窗口背景设置为透明
15 setAttribute(Qt::WA_TranslucentBackground);
16 }
17
18 Widget::~Widget()
19 {
20 delete ui;
21 }
22
23 void Widget::paintEvent(QPaintEvent *event)
24 {
25 QPainter p(this);
26 p.drawPixmap(0, 0, QPixmap("../image/sunny.png"));
27 }
28
29 void Widget::mouseMoveEvent(QMouseEvent *event)
30 {
31 if (event->buttons() & Qt::LeftButton) {
32 move(event->globalPos() - p);
33 }
34 }
35
36 void Widget::mousePressEvent(QMouseEvent *event)
37 {
38 if (event->button() == Qt::RightButton) {
39 //如果是右键
40 close();
41 } else if (event->button() == Qt::LeftButton) {
42 //求坐标差值
43 //当前点击坐标-窗口左下角坐标
44 p = event->globalPos() - this->frameGeometry().topLeft();
45 }
46 }
widget.h

1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QPoint>
6
7 namespace Ui {
8 class Widget;
9 }
10
11 class Widget : public QWidget
12 {
13 Q_OBJECT
14
15 public:
16 explicit Widget(QWidget *parent = 0);
17 ~Widget();
18
19 protected:
20 void paintEvent(QPaintEvent *event);
21 void mouseMoveEvent(QMouseEvent *event);
22 void mousePressEvent(QMouseEvent *event);
23
24 private:
25 Ui::Widget *ui;
26
27 QPoint p;
28 };
29
30 #endif // WIDGET_H
Qt-不规则窗口的更多相关文章
- 给QT不规则窗口添加阴影
在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...
- QT笔记之不规则窗口的实现
QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...
- QT:不规则窗口的实现
主要思路:1:将窗体设为Qt::FramelessWindowHint(去掉标题栏).2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透. 3:重载程序的鼠标事件. 运行时截图 ...
- Qt 不规则窗体的实现(构造函数里setPaletteBackgroundPixmap后设置setMask)
Skin(表皮) 是制作比较酷的软件界面的有利工具. 一个软件可以同时使用多种Skin 以取得不同的外观, 使同一个软件有截然不同的风格. 用户可以根据自己的喜好选择 不同的风格. 本节介绍使用 Qt ...
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- [转] - 使用Qt作窗口截屏(含源码)
截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- Windows SDK 实现不规则窗口介绍
不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- 【Qt】窗口居中显示
w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...
随机推荐
- Flink Standalone集群部署
Flink Standalone模式部署集群是最简单的一种部署方式,不依赖于其他的组件,另外还支持YARN/Mesos/Docker等模式下的部署,这里使用的flink版本为最新的稳定版1.9.1版本 ...
- 如何使用鞋厂ERP等企业管理软件提高企业运营整体效率?
ERP把企业客户需求.市场规划.产品研发.内部制造等活动以及供应商的资源整合在一起,形成企业一个完整的产业链和供应链,通过企业多个环节的无缝链接和整体运作来提高企业运营整体效率: (1) . 对整个产 ...
- 力扣1097(MySQL)-游戏玩法分析Ⅴ(困难)
题目: 我们将玩家的安装日期定义为该玩家的第一个登录日. 我们还将某个日期 X 的第 1 天留存时间定义为安装日期为 X 的玩家的数量,他们在 X 之后的一天重新登录,除以安装日期为 X 的玩家的数量 ...
- Understand Abstraction and Interface
Foreword 抽象和接口是Java中的两个关键字,也是两种最基本的优化软件项目手段.为什么说它们是一种优化项目的手段? 人分三六九等,不同等级的人,所接触的事和处理的事是不一样的.同理,项目也分大 ...
- 一文剖析PolarDB HTAP的列存数据压缩
简介: PolarDB MySQL是阿里云自研的云原生数据库,主要处理在线事务负载(OLTP, OnLine Transactional Processing),深受企业用户的青睐. 前言 数据库迁移 ...
- 安全同学讲Maven间接依赖场景的仲裁机制
简介: 去年的Log4j-core的安全问题,再次把供应链安全推向了高潮.在供应链安全的场景,蚂蚁集团在静态代码扫描平台-STC和资产威胁透视平台-哈勃这2款产品在联合合作下,优势互补,很好的解决了直 ...
- MaxCompute同步数据的网络配置
MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库.数据集成功能已经集成到DataWorks作为 ...
- 阿里云服务网格 ASM 正式发布商业化版本
简介:为了更好地满足企业日益加深的大规模使用服务网格产品.服务多语言互通.服务精细治理等需求,2022 年 4 月 1 日起,阿里云服务网格产品 ASM 正式发布商业化版本,为企业在生产环境下大规模 ...
- 基于 KubeVela 的机器学习实践
简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务. 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练.调试自己 ...
- 为了让你在“口袋奇兵”聊遍全球,Serverless 做了什么?
简介: 江娱互动是一家新兴的游戏企业,自 2018 年成立伊始,江娱互动就面向广阔的全球游戏市场,通过创造有趣的游戏体验,在竞争激烈的游戏市场占得一席之地.仅仅 2 年的时间,江娱互动就凭借 Topw ...