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())/); 上述方法可以置中,但 ...
随机推荐
- API 开发的后盾:平台工程提供强力动态支持
过去几年,开发团队一直在发展传统的 DevOps.一些开发人员认为,CloudOps 或 DeploymentOps 等新实践的兴起将会导致回到孤岛问题.其他人则不愿意在承担所有其他职责之外构建.部署 ...
- 阿里云张新涛:连接产业上下游,构建XR协作生态
简介: 用交互技术辅以澎湃的算力带给大家最真实的"沉浸式体验" 2022年9月2日,在世界人工智能大会"区块新生 数字宇宙--元宇宙技术与生态合作"分论坛上,阿 ...
- Redis消息队列发展历程
简介:Redis是目前最受欢迎的kv类数据库,当然它的功能越来越多,早已不限定在kv场景,消息队列就是Redis中一个重要的功能.Redis从2010年发布1.0版本就具备一个消息队列的雏形,随着1 ...
- [GPT] golang代码组织的核心思想
1/golang代码组织的核心思想 Go语言(Golang)在代码组织上的核心思想是模块化和封装,主要体现在以下几个方面: 1.包(Packages): Go语言通过包(Packages)来组织代码, ...
- dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承
从设计上,用户控件 UserControl 就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的 UserControl 用户控件.对于大部分的用户控件来说,都是采用组合现有的控件来实现 ...
- win10 uwp 使用 XamlTreeDump 获取 XAML 树元素内容
本文来安利大家 XamlTreeDump 库,通过这个库可以将 XAML 树上的元素转换为 json 字符串,可以用来进行 UI 单元测试 开始之前先通过 NuGet 工具安装 XamlTreeDum ...
- 一文搞懂drag&drop浏览器拖放功能的实现
拖放功能,即将一个元素从一个区域,通过拖拽,放置到另一个区域.常见的应用是将文件或图片从一个区域,拖放到另一个区域.中文常常把这表述成拖拽,实际上拖拽的描述并不准确,应该叫拖放,因为drag事件和dr ...
- Linux定时任务实现每秒执行一次
编写/root/test.sh脚本 该方法适用于调度周期能被60整除的情况 #!/bin/bash step=1 for (( i = 0; i < 60; i = (i+step) )); d ...
- 解决浏览器打不开github网站常用方法
switchHost使用指南 https://blog.csdn.net/weixin_45022563/article/details/123922815 下载软件: https://github. ...
- vue3.0 用vue ui 新建项目
安装步骤: 1.打开安装界面 打开cmd vue ui 2.选择要安装的位置 3.设置详情 4.设置预设 5.设置功能 选择Babel / Router / Linter/Formatter / 使用 ...