Qt下实现不规则形状窗口显示
文章目录
- 前言
- 一、资源文件的添加
- 二、初始化窗口
- 三、重写paintEvent函数实现窗口重绘
- 四、重写QMouseEvent相关函数实现不规则窗口的移动及关闭
- 五、demo完整代码
- 六、下载链接
- 总结
前言
本文实现了Qt下显示两个不规则形状的窗口demo,其中有Qt的窗口对话框和QPaintEvent及QMouseEvent的简单使用,这里将相关内容展示出来,以便大家学习,如有错误之处,欢迎大家批评指正。
项目效果

提示:以下是本篇文章正文内容,下面案例可供参考
一、资源文件的添加
首先要准备好透明背景的图片,之后行成的窗口就是你的图片的形状,在本文的demo中有将图片添加为资源文件,添加资源文件的步骤在我以前写的文章有详细描述,读者可自行查看:(一)Qt实现自定义控件的两种方式—提升法(不添加资源文件的话注意图片的输入路径就行)
二、初始化窗口
这里进行窗口的初始化,其中主要的函数是setMask(),可以通过F1来查看该函数详细信息:
void Dialog::initWidget()
{//保持顶部窗口this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);QPixmap pix;pix.load(":/photo/flower.png",0,Qt::AvoidDither); //如果没有将图片添加为资源文件,此处路径更改为完整路径resize(pix.size());setMask(QBitmap(pix.mask())); //设置透明setAttribute(Qt::WA_TranslucentBackground); //去除毛边//实例化对象myLL = new MyLL();
}
三、重写paintEvent函数实现窗口重绘
void Dialog::paintEvent(QPaintEvent *event)
{//qDebug()<<"event:"<<event;QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/photo/flower.png"),QRect());
}
四、重写QMouseEvent相关函数实现不规则窗口的移动及关闭
void Dialog::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){startPoint = event->globalPos() - frameGeometry().topLeft();event->accept();}if(event->button() == Qt::RightButton){myLL->show();}if(event->button() == Qt::MidButton){//关闭全部窗口myLL->close();this->close();}
}void Dialog::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons() & Qt::LeftButton){move(event->globalPos() - startPoint);event->accept();}
}
五、demo完整代码
1.MyPhoto.pro
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11DEFINES += QT_DEPRECATED_WARNINGS#设置生成名称及图标
RC_ICONS = ll.ico
TARGET = lingSOURCES += \main.cpp \dialog.cpp \myll.cppHEADERS += \dialog.h \myll.hFORMS += \dialog.ui \myll.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \photo.qrc#全局忽略编译警告QMAKE_CXXFLAGS
QMAKE_CXXFLAGS += -Wno-unused-function #未使用的函数
QMAKE_CXXFLAGS += -Wno-unused-parameter #设置了但未使用的参数
QMAKE_CXXFLAGS += -Wno-comment #注释使用不规范
QMAKE_CXXFLAGS += -Wno-sequence-point #如出现i=i++这类代码,则报警告
2.main.cpp
#include "dialog.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;if(w.keepHappy()){w.show();}return a.exec();
}
3.dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QMessageBox>
#include "myll.h"QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void initWidget();bool keepHappy();protected:void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);private:Ui::Dialog *ui;QPoint startPoint;MyLL *myLL;
};
#endif // DIALOG_H
4.dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);this->initWidget();
}Dialog::~Dialog()
{delete myLL;delete ui;
}void Dialog::initWidget()
{//保持顶部窗口this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);QPixmap pix;pix.load(":/photo/flower.png",0,Qt::AvoidDither); //如果没有将图片添加为资源文件,此处路径更改为完整路径resize(pix.size());setMask(QBitmap(pix.mask())); //设置透明setAttribute(Qt::WA_TranslucentBackground); //去除毛边//实例化对象myLL = new MyLL();
}//main函数调用
bool Dialog::keepHappy()
{const QMessageBox::StandardButton ret= QMessageBox::information(this,"Nice to meet you!!!Love Lingling","Be confident and happy every day! Send you a flower flower ~~~""\n每天都要自信且开心喔!送你一朵小花花~",QMessageBox::Yes | QMessageBox::No);if(ret == QMessageBox::Yes){return true;}else{keepHappy();}return true;
}void Dialog::paintEvent(QPaintEvent *event)
{//qDebug()<<"event:"<<event;QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/photo/flower.png"),QRect());
}void Dialog::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){startPoint = event->globalPos() - frameGeometry().topLeft();event->accept();}if(event->button() == Qt::RightButton){myLL->show();}if(event->button() == Qt::MidButton){//关闭全部窗口myLL->close();this->close();}
}void Dialog::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons() & Qt::LeftButton){move(event->globalPos() - startPoint);event->accept();}
}
5.myll.h
#ifndef MYLL_H
#define MYLL_H#include <QWidget>
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
#include <QDebug>namespace Ui {
class MyLL;
}class MyLL : public QWidget
{Q_OBJECTpublic:explicit MyLL(QWidget *parent = nullptr);~MyLL();void initWidget();protected:void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);private:Ui::MyLL *ui;QPoint startPoint;
};
#endif // MYLL_H
6.myll.cpp
#include "myll.h"
#include "ui_myll.h"MyLL::MyLL(QWidget *parent) :QWidget(parent),ui(new Ui::MyLL)
{ui->setupUi(this);this->initWidget();
}MyLL::~MyLL()
{delete ui;
}void MyLL::initWidget()
{this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);QPixmap pix;pix.load(":/photo/ll.png",0,Qt::AvoidDither);resize(pix.size());setMask(QBitmap(pix.mask())); //设置透明//setAttribute(Qt::WA_TranslucentBackground); //去除毛边
}void MyLL::paintEvent(QPaintEvent *event)
{//qDebug()<<"event:"<<event;QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/photo/ll.png"),QRect());
}void MyLL::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){startPoint = event->globalPos() - frameGeometry().topLeft();event->accept();}if(event->button() == Qt::RightButton){this->close();}
}void MyLL::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons() & Qt::LeftButton){move(event->globalPos() - startPoint);event->accept();}
}
7.dialog.ui(新建项目时选择了QDialog作为Base class)

8.myll.ui(新建Qt设计师界面类时选择了Widget作为界面模板)

六、下载链接
demo百度网盘链接:https://pan.baidu.com/s/1_v1lC1unytYTEituAJJ8iA
提取码:xxcj
–
总结
这里是一个简单的Qt开发demo,所用到的一些知识点都在文章中添加了注释,另外所用的图片需要透明的,这样才能实现不规则窗口显示,界面显示的文字读者可自定义,不要在意我写的那些哈~(PS:本demo是我用来哄对象开心的,送了一朵花和她喜欢的皮卡丘,嘿嘿嘿)
hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。
参考博客:Qt学习笔记——不规则窗口(自定义形状窗口
相关文章:
Qt下实现不规则形状窗口显示
文章目录前言一、资源文件的添加二、初始化窗口三、重写paintEvent函数实现窗口重绘四、重写QMouseEvent相关函数实现不规则窗口的移动及关闭五、demo完整代码六、下载链接总结前言 本文实现了Qt下显示两个不规则形状的窗口demo,其中有Qt的窗口对话框和QPaintEvent…...
使用ribbon实现负载均衡
1.新建两个provider:springcloud-provider-dept-8002 2. 配置跟8001一样 整合 Ribbon 由上述可知,Ribbon 是需要集成在消费端的 所以在消费端 : springcloud-03-consumer-dept-8082 进行修改 在 POM 文件中添加 Ribbon、Eureka 依赖 <!--…...
从页面仔到工程师,前端到底在发挥什么价值
玉伯在前端圈子里摸爬滚打十几年,他对前端价值的理解是什么样的?在他眼里,前端到底是一个怎样的岗位?我们带着这样的问题向他提问。支付宝体验技术部是前端同学最希望加入的团队之一,玉伯带领这个团队做出诸多创新产品…...
Java程序员进阶宝典,让你学习面试无忧!
心净则明,心诚则灵如果你想要一个月速成程序员,那么这篇文章不适合,如果你仅想要在IT圈“耍酷”,那你也不需要研读,如果你执着询问“退化”成为一名程序猿有啥捷径,那我只能告诉你,此路不通!不可…...
Hadoop HDFS的主要架构与读写文件
一、Hadoop HDFS的架构 HDFS:Hadoop Distributed File System,分布式文件系统 1,NameNode 存储文件的metadata,运行时所有数据都保存到内存,整个HDFS可存储的文件数受限于NameNode的内存大小一个Block在…...
面试题练习第五篇
面试题第五篇1. 说说React生命周期中有哪些坑?如何避免?2. 说说Real diff算法是怎么运作的?3. 调和阶段setState干了什么?4. 说说redux的实现原理是什么,写出核心代码?5. React合成事件的原理?6…...
hadoop02【尚硅谷】
HDFS 大数据学习笔记 一、HDFS产出背景及定义 HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件&#x…...
Alist ——本地网盘管理器
Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中,在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码,和端口进入浏览器 输入 :127.0.0.1:5244用…...
【白话科普】聊聊网络架构变革的关键——SDN
最近二狗子在网上冲浪的时候,不小心将 CDN 搜索成了 SDN,结果跳出来了一大堆相关的知识点。 好学的二狗子当然不会随随便便糊弄过去,于是认认真真学习了好久,终于了解了 SDN 是什么。 原来,SDN 的全称是 Software De…...
go gin学习记录4
环境 环境:mac m1,go version 1.17.2, goland, mysql 除了原生sql,和orm操作之外,go还有一类包,只用于生成sql,典型的如sqlbuilder,今天就来研究一下它。 安装sqlbuil…...
家政服务小程序实战开发教程015-填充用户信息
我们上一篇讲解了立即预约功能,存在的问题是,每次都需要用户填写联系信息。在我们前述篇章中已经介绍了用户注册的功能,在立即预约的时候我们需要把已经填写的用户信息提取出来,显示到表单对应的字段中。本篇我们就讲解一下如何提…...
python+selenium使用webdriver启动chrome出现闪退现象解决
这两天发现之前开发的爬虫程序出问题了:谷歌浏览器出现打开立即闪退的现象,代码未修改过,检查也没有任何问题! 查看chrome浏览器发现版本更新了 ↑(点击chrome浏览器右上角三个点,最下面帮助→Google Chr…...
新建idea项目
目录IDEA系列之创建各种项目 https://blog.csdn.net/LOVEQD123/article/details/105886077 idea 创建项目的三种方式 https://blog.csdn.net/weixin_50034122/article/details/118754521 创建空项目 https://blog.csdn.net/qq_44537956/article/details/123075134 创建 spri…...
Django框架之类视图
类视图 思考:一个视图,是否可以处理两种逻辑?比如get和post请求逻辑。 如何在一个视图中处理get和post请求 注册视图处理get和post请求 以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供…...
win11/10+Azure kinect DK配置 VS2019/2017/2015的方法(简单,亲测可以)
首先下载文件:文件的下载和安装方法参考我的博客(131条消息) WIN11/win10Azure Kinect DK详细驱动配置教程(亲测)_Vertira的博客-CSDN博客安装好VS2019,创建好控制台c工程。这些都很简单,不细说。配置:首先配置环境变量…...
子查询的相关例题
子查询的相关例题: 查询和Zlotkey相同部门的员工姓名和工资 SELECT e1.last_name,e1.first_name,e1.salary FROM employees e1 WHERE e1.department_id (SELECT e2.department_idFROM employees e2WHERE e2.last_nameZlotkey );查询工资比公司平均工资高的员工号…...
vue2.0与vue3.0及vue与react区别
vue2.0与3.0及vue与react区别vue2.0 与 vue3.0 区别1. 双向绑定原理2.Vue3支持碎片(Fragments)3.Composition API4.生命周期5.v-if和v-for的优先级6.typescript支持vue与 react区别共同点1.虚拟domdiff算法2.提供了响应式和组件化的视图组件。3.注意力集中保持在核心库…...
【SQL】MySQL秘籍
chihiro-notes 千寻简笔记 v0.1 内测版 📔 笔记介绍 大家好,千寻简笔记是一套全部开源的企业开发问题记录,毫无保留给个人及企业免费使用,我是作者星辰,笔记内容整理并发布,内容有误请指出,笔…...
vue-router 的基本用法
vue-router 的基本用法 1.什么是 vue-router vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。 vue-router 的官方文档地址:https://router.vuejs.org/zh/ 2.vue-router 安装和配置的…...
图像显著性目标检测
一、概述 1、定义 图像显著性检测(Saliency Detection,SD), 指通过智能算法模拟人的视觉系统特点,预测人类的视觉凝视点和眼动,提取图像中的显著区域(即人类感兴趣的区域),可以广泛用于目标识别、图像编辑以及图像检索等领域&am…...
单片机AD采样十大滤波算法详解与应用
1. 单片机AD采样滤波算法概述在嵌入式系统开发中,ADC采样是获取模拟信号的关键环节。然而实际应用中,采样值常会受到各种干扰影响,导致数据波动甚至错误。作为一名有着十年嵌入式开发经验的工程师,我总结了十种最实用的AD采样滤波…...
XPT2046触摸驱动设计与车载嵌入式集成实践
1. XPT2046 触摸控制器驱动技术解析与嵌入式集成实践XPT2046 是一款广泛应用于嵌入式人机交互系统的 12 位逐次逼近型(SAR)模数转换器(ADC),专为四线/五线电阻式触摸屏设计。其核心功能并非独立显示驱动,而…...
[资源管理]:全链路智能化的Manifest协同方案
[资源管理]:全链路智能化的Manifest协同方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 定位核心矛盾:资源管理的系统性困境 在数字内容分发领域,Manife…...
Debian 12 内网求生记:手把手搞定1Panel离线安装与Docker启动(附iptables补丁)
Debian 12 内网求生记:手把手搞定1Panel离线安装与Docker启动(附iptables补丁) 1. 内网环境下的技术挑战 在完全隔离的内网环境中部署现代化运维工具,就像在没有GPS的荒野中寻找方向。我们面对的不仅是网络连接的缺失,…...
降AI后格式乱了怎么修:Word格式修复操作指南
降AI后格式乱了怎么修:Word格式修复操作指南 上周室友第一次用降AI工具,操作错了好几步,差点浪费机会。觉得有必要写一篇详细教程。 我用的是嘎嘎降AI(www.aigcleaner.com),4.8元一篇,达标率9…...
Agent记忆架构从入门到精通:10种方案全解析,收藏这篇就够了!
继续看Agent记忆进展,看10种Agent记忆方案对比总结,可以借此机会,看看这些记忆系统在设计的时候都有哪些组件,有哪些优化策略,以及有哪些经验。【我们已经陆陆续续讲了多个了,也有一些综述,但拉…...
3步搞定小红书内容采集:XHS-Downloader免费无水印下载终极指南
3步搞定小红书内容采集:XHS-Downloader免费无水印下载终极指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户…...
倒排索引详解
文章目录倒排索引(Inverted Index)正排索引与倒排索引实现优缺点倒排索引(Inverted Index) 倒排索引是信息检索领域最核心的数据结构,几乎所有搜索引擎(Google、Elasticsearch、Lucene)都基于它…...
9篇8章2节:MIMIC 数据库的 CITI 注册与课程选择(2026年版)
作为包含敏感患者信息的公共数据库,MIMIC 对使用权限的申请设置了严格的伦理与合规门槛,其核心目的在于保障患者隐私、维护学术诚信。其中,通过 CITI Program 的人体研究伦理认证是不可或缺的前置条件,也是衡量研究人员是否具备合规研究素养的关键标准。本文将详细拆解 202…...
【花雕学编程】嵌入式 AI Agent:从云端到终端,开启物理世界智能新范式
【花雕学编程】嵌入式 AI Agent:从云端到终端,开启物理世界智能新范式 ——当 AI 不再只是屏幕里的聊天窗口,而是真正走进工厂、家庭和城市——嵌入式 AI Agent 正在重新定义“智能”的边界 引言 当下 AI 热潮的本质,是对“AI 从云…...
