当前位置: 首页 > news >正文

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&#xff0c;其中有Qt的窗口对话框和QPaintEvent…...

使用ribbon实现负载均衡

1.新建两个provider&#xff1a;springcloud-provider-dept-8002 2. 配置跟8001一样 整合 Ribbon 由上述可知&#xff0c;Ribbon 是需要集成在消费端的 所以在消费端 &#xff1a; springcloud-03-consumer-dept-8082 进行修改 在 POM 文件中添加 Ribbon、Eureka 依赖 <!--…...

从页面仔到工程师,前端到底在发挥什么价值

玉伯在前端圈子里摸爬滚打十几年&#xff0c;他对前端价值的理解是什么样的&#xff1f;在他眼里&#xff0c;前端到底是一个怎样的岗位&#xff1f;我们带着这样的问题向他提问。支付宝体验技术部是前端同学最希望加入的团队之一&#xff0c;玉伯带领这个团队做出诸多创新产品…...

Java程序员进阶宝典,让你学习面试无忧!

心净则明,心诚则灵如果你想要一个月速成程序员&#xff0c;那么这篇文章不适合&#xff0c;如果你仅想要在IT圈“耍酷”&#xff0c;那你也不需要研读&#xff0c;如果你执着询问“退化”成为一名程序猿有啥捷径&#xff0c;那我只能告诉你&#xff0c;此路不通&#xff01;不可…...

Hadoop HDFS的主要架构与读写文件

一、Hadoop HDFS的架构 HDFS&#xff1a;Hadoop Distributed File System&#xff0c;分布式文件系统 &#xff11;&#xff0c;NameNode 存储文件的metadata&#xff0c;运行时所有数据都保存到内存&#xff0c;整个HDFS可存储的文件数受限于NameNode的内存大小一个Block在…...

面试题练习第五篇

面试题第五篇1. 说说React生命周期中有哪些坑&#xff1f;如何避免&#xff1f;2. 说说Real diff算法是怎么运作的&#xff1f;3. 调和阶段setState干了什么&#xff1f;4. 说说redux的实现原理是什么&#xff0c;写出核心代码&#xff1f;5. React合成事件的原理&#xff1f;6…...

hadoop02【尚硅谷】

HDFS 大数据学习笔记 一、HDFS产出背景及定义 HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#x…...

Alist ——本地网盘管理器

Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中&#xff0c;在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码&#xff0c;和端口进入浏览器 输入 &#xff1a;127.0.0.1:5244用…...

【白话科普】聊聊网络架构变革的关键——SDN

最近二狗子在网上冲浪的时候&#xff0c;不小心将 CDN 搜索成了 SDN&#xff0c;结果跳出来了一大堆相关的知识点。 好学的二狗子当然不会随随便便糊弄过去&#xff0c;于是认认真真学习了好久&#xff0c;终于了解了 SDN 是什么。 原来&#xff0c;SDN 的全称是 Software De…...

go gin学习记录4

环境 环境&#xff1a;mac m1&#xff0c;go version 1.17.2&#xff0c; goland&#xff0c; mysql 除了原生sql&#xff0c;和orm操作之外&#xff0c;go还有一类包&#xff0c;只用于生成sql&#xff0c;典型的如sqlbuilder&#xff0c;今天就来研究一下它。 安装sqlbuil…...

家政服务小程序实战开发教程015-填充用户信息

我们上一篇讲解了立即预约功能&#xff0c;存在的问题是&#xff0c;每次都需要用户填写联系信息。在我们前述篇章中已经介绍了用户注册的功能&#xff0c;在立即预约的时候我们需要把已经填写的用户信息提取出来&#xff0c;显示到表单对应的字段中。本篇我们就讲解一下如何提…...

python+selenium使用webdriver启动chrome出现闪退现象解决

这两天发现之前开发的爬虫程序出问题了&#xff1a;谷歌浏览器出现打开立即闪退的现象&#xff0c;代码未修改过&#xff0c;检查也没有任何问题&#xff01; 查看chrome浏览器发现版本更新了 ↑&#xff08;点击chrome浏览器右上角三个点&#xff0c;最下面帮助→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框架之类视图

类视图 思考&#xff1a;一个视图&#xff0c;是否可以处理两种逻辑&#xff1f;比如get和post请求逻辑。 如何在一个视图中处理get和post请求 注册视图处理get和post请求 以函数的方式定义的视图称为函数视图&#xff0c;函数视图便于理解。但是遇到一个视图对应的路径提供…...

win11/10+Azure kinect DK配置 VS2019/2017/2015的方法(简单,亲测可以)

首先下载文件&#xff1a;文件的下载和安装方法参考我的博客(131条消息) WIN11/win10Azure Kinect DK详细驱动配置教程&#xff08;亲测&#xff09;_Vertira的博客-CSDN博客安装好VS2019,创建好控制台c工程。这些都很简单&#xff0c;不细说。配置&#xff1a;首先配置环境变量…...

子查询的相关例题

子查询的相关例题&#xff1a; 查询和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.注意力集中保持在核心库&#xf…...

【SQL】MySQL秘籍

chihiro-notes 千寻简笔记 v0.1 内测版 &#x1f4d4; 笔记介绍 大家好&#xff0c;千寻简笔记是一套全部开源的企业开发问题记录&#xff0c;毫无保留给个人及企业免费使用&#xff0c;我是作者星辰&#xff0c;笔记内容整理并发布&#xff0c;内容有误请指出&#xff0c;笔…...

vue-router 的基本用法

vue-router 的基本用法 1.什么是 vue-router vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用&#xff0c;能够轻松的管理 SPA 项目中组件的切换。 vue-router 的官方文档地址&#xff1a;https://router.vuejs.org/zh/ 2.vue-router 安装和配置的…...

图像显著性目标检测

一、概述 1、定义 图像显著性检测(Saliency Detection,SD)&#xff0c; 指通过智能算法模拟人的视觉系统特点&#xff0c;预测人类的视觉凝视点和眼动&#xff0c;提取图像中的显著区域(即人类感兴趣的区域)&#xff0c;可以广泛用于目标识别、图像编辑以及图像检索等领域&am…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...