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. API 开发的后盾:平台工程提供强力动态支持

    过去几年,开发团队一直在发展传统的 DevOps.一些开发人员认为,CloudOps 或 DeploymentOps 等新实践的兴起将会导致回到孤岛问题.其他人则不愿意在承担所有其他职责之外构建.部署 ...

  2. 阿里云张新涛:连接产业上下游,构建XR协作生态

    简介: 用交互技术辅以澎湃的算力带给大家最真实的"沉浸式体验" 2022年9月2日,在世界人工智能大会"区块新生 数字宇宙--元宇宙技术与生态合作"分论坛上,阿 ...

  3. Redis消息队列发展历程

    ​简介:Redis是目前最受欢迎的kv类数据库,当然它的功能越来越多,早已不限定在kv场景,消息队列就是Redis中一个重要的功能.Redis从2010年发布1.0版本就具备一个消息队列的雏形,随着1 ...

  4. [GPT] golang代码组织的核心思想

    1/golang代码组织的核心思想 Go语言(Golang)在代码组织上的核心思想是模块化和封装,主要体现在以下几个方面: 1.包(Packages): Go语言通过包(Packages)来组织代码, ...

  5. dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承

    从设计上,用户控件 UserControl 就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的 UserControl 用户控件.对于大部分的用户控件来说,都是采用组合现有的控件来实现 ...

  6. win10 uwp 使用 XamlTreeDump 获取 XAML 树元素内容

    本文来安利大家 XamlTreeDump 库,通过这个库可以将 XAML 树上的元素转换为 json 字符串,可以用来进行 UI 单元测试 开始之前先通过 NuGet 工具安装 XamlTreeDum ...

  7. 一文搞懂drag&drop浏览器拖放功能的实现

    拖放功能,即将一个元素从一个区域,通过拖拽,放置到另一个区域.常见的应用是将文件或图片从一个区域,拖放到另一个区域.中文常常把这表述成拖拽,实际上拖拽的描述并不准确,应该叫拖放,因为drag事件和dr ...

  8. Linux定时任务实现每秒执行一次

    编写/root/test.sh脚本 该方法适用于调度周期能被60整除的情况 #!/bin/bash step=1 for (( i = 0; i < 60; i = (i+step) )); d ...

  9. 解决浏览器打不开github网站常用方法

    switchHost使用指南 https://blog.csdn.net/weixin_45022563/article/details/123922815 下载软件: https://github. ...

  10. vue3.0 用vue ui 新建项目

    安装步骤: 1.打开安装界面 打开cmd vue ui 2.选择要安装的位置 3.设置详情 4.设置预设 5.设置功能 选择Babel / Router / Linter/Formatter / 使用 ...