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-不规则窗口的更多相关文章

  1. 给QT不规则窗口添加阴影

    在家休息,试着用QT去模仿各类管家软件的界面,做到自绘阴影的时候,蛋疼了. 网上搜到的基本都是一篇文章转来转去,一开始也被思路限制了. 尝试重载paintEvent,然后自己绘制矩形阴影,但是绘制的算 ...

  2. QT笔记之不规则窗口的实现

    QT实现的不规则窗口,是根据图片的形状显示 1.去标题栏 2.设置窗口背景为透明色 3.最后给窗口设置背景色 注:背景图为镂空的 格式为.png 图片资源下载:http://pan.baidu.com ...

  3. QT:不规则窗口的实现

    主要思路:1:将窗体设为Qt::FramelessWindowHint(去掉标题栏).2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透. 3:重载程序的鼠标事件. 运行时截图 ...

  4. Qt 不规则窗体的实现(构造函数里setPaletteBackgroundPixmap后设置setMask)

    Skin(表皮) 是制作比较酷的软件界面的有利工具. 一个软件可以同时使用多种Skin 以取得不同的外观, 使同一个软件有截然不同的风格. 用户可以根据自己的喜好选择 不同的风格. 本节介绍使用 Qt ...

  5. Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)

    之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...

  6. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  7. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  8. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...

  9. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  10. 【Qt】窗口居中显示

    w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...

随机推荐

  1. 如何使用鞋厂ERP等企业管理软件提高企业运营整体效率?

    ERP把企业客户需求.市场规划.产品研发.内部制造等活动以及供应商的资源整合在一起,形成企业一个完整的产业链和供应链,通过企业多个环节的无缝链接和整体运作来提高企业运营整体效率: (1) . 对整个产 ...

  2. flutter 移动应用程序中打开URL

    url_launcher: ^6.2.5   在Flutter中,url_launcher库是用于在移动应用程序中打开URL的常用工具.它允许你通过调用系统的浏览器或其他应用程序来打开指定的URL,比 ...

  3. 【笔记】Java相关大杂烩②

    [笔记]Java相关大杂烩② if单分支情况下,如果没有加 {},那么默认只包含第一条语句. if 和 else 分支后面如果包含多条语句,那么需要使用 {} 括起来. 不能随意地使用数学上的表达方式 ...

  4. 讲座回顾丨基于 OpenYurt 和 EdgeX 的云边端协同新可能

    简介: 为帮助参赛选手更好地了解并运用相关技术,本次大赛将在 7 月至 9 月持续开展 3 轮技术培训,涵盖初.中.高不同层级,帮助开发者系统学习智能边缘系统知识.我们邀请到来自英特尔.VMware. ...

  5. 阿里云交互式分析与Presto对比分析及使用注意事项

    阿里云交互式分析与Presto对比分析及使用注意事项本文由阿里巴巴耿江涛带来以"阿里云交互式分析与Presto对比分析及使用注意事项"为题的演讲.文章首先介绍了Presto以及它的 ...

  6. 函数计算GB镜像秒级启动:下一代软硬件架构协同优化揭秘

    简介: 优化镜像加速冷启动大致分为两种做法:降低绝对延迟和降低冷启动概率.自容器镜像上线以来我们已经通过镜像加速技术,分阶段降低了绝对延迟.本文在此基础上,介绍借助函数计算下一代IaaS底座神龙裸金属 ...

  7. 实用的 Bash 快捷键

    前端也有需要运维的时候,这时我们不可避免需要登录 Linux 服务器,并在 Bash 终端输入一些命令,当需要对输入的命令进行一些操作时,比如快速移动光标位置或快速删除字符,如果只会用方向键和退格键, ...

  8. Solution Set - NOI真题

    NOI2024 RP++! NOI2018 Day1T1 Link&Submission. 考虑一个最高的水位线使所有点通过没有积水的边就可以连通,也就是求出了一棵海拔的最大生成树.会发现只有 ...

  9. 集群监管-USDP(智能大数据平台)

    UCloud Smart Data Platform(简称 USDP),是 UCloud 推出的智能化.轻量级.适用于私有化部署至客户本地的大数据基础服务平台,通过自研的 USDP Manager 管 ...

  10. List<T> 根据对象中的属性处理数据

    一.创建测试数据 UserEntity user1 = UserEntity.builder().id(1).name("张三").sex(0).build(); UserEnti ...