《QT实用小工具·四十六》多边形窗口

news2024/11/26 22:44:30

1、概述
源码放在文章末尾

该项目实现了可以移动的多边形窗口,项目demo演示如下所示:
在这里插入图片描述
项目部分代码如下所示:

#include "polygonwindow.h"

#include <QBitmap>
#include <QQuickItem>
#include <QQmlFile>
#include <QSGSimpleTextureNode>

class PolygonItem : public QQuickItem
{
public:
    PolygonItem(QQuickItem *parent = nullptr) : QQuickItem (parent) {
        setFlag(ItemHasContents);
    }

    void setTexture(QSGTexture *texture);

protected:
    virtual QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *);

private:
    QScopedPointer<QSGTexture> m_texture;
};

void PolygonItem::setTexture(QSGTexture *texture)
{
    m_texture.reset(texture);
}

QSGNode* PolygonItem::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
{
    QSGSimpleTextureNode *n = static_cast<QSGSimpleTextureNode *>(node);
    if (n) {
        if (!m_texture.isNull()) {
            n->setTexture(m_texture.data());
            n->setFiltering(QSGTexture::Linear);
            n->setRect(boundingRect());
        }
    } else {
        n = new QSGSimpleTextureNode();
        if (!m_texture.isNull()) {
            n->setTexture(m_texture.data());
            n->setFiltering(QSGTexture::Linear);
            n->setRect(boundingRect());
        }
    }

    return n;
}

class PolygonWindowPrivate
{
public:
    QPoint m_startPos;
    QPoint m_oldPos;
    QUrl m_source;
    QPixmap m_background;
    QScopedPointer<PolygonItem> m_centerItem;
};

PolygonWindow::PolygonWindow(QWindow *parent)
    : QQuickWindow (parent)
{
    d = new PolygonWindowPrivate;
    setOpacity(0.8);
    setColor(Qt::transparent);
    setFlags(flags() | Qt::Window | Qt::FramelessWindowHint);

    connect(this, &QQuickWindow::widthChanged, this, [this](int) {
        changeTexture();
    });
    connect(this, &QQuickWindow::heightChanged, this, [this](int) {
        changeTexture();
    });
    connect(this, &QQuickWindow::sceneGraphInitialized, this, [this]() {
        d->m_centerItem.reset(new PolygonItem(contentItem()));
        changeTexture();
    });
}

PolygonWindow::~PolygonWindow()
{
    delete d;
}

QUrl PolygonWindow::source() const
{
    return d->m_source;
}

void PolygonWindow::setSource(const QUrl &source)
{
    if (source != d->m_source) {
        d->m_source = source;
        d->m_background = QQmlFile::urlToLocalFileOrQrc(source);
        changeTexture();
        emit sourceChanged();
    }
}

void PolygonWindow::mousePressEvent(QMouseEvent *event)
{
    d->m_startPos = event->globalPos();
    d->m_oldPos = position();
    event->ignore();

    QQuickWindow::mousePressEvent(event);
}

void PolygonWindow::mouseReleaseEvent(QMouseEvent *event)
{
    d->m_oldPos = position();

    QQuickWindow::mouseReleaseEvent(event);
}

void PolygonWindow::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        setPosition(d->m_oldPos - d->m_startPos + event->globalPos());
    }

    QQuickWindow::mouseMoveEvent(event);
}

void PolygonWindow::changeTexture()
{
    auto texture = d->m_background.scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
    if (!texture.isNull()) {
        d->m_background = texture;
        setMask(QRegion(d->m_background.mask()));
        if (d->m_centerItem) {
            d->m_centerItem->setSize(size());
            d->m_centerItem->setTexture(createTextureFromImage(d->m_background.toImage(), TextureHasAlphaChannel));
        }
    }
    update();
}

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

AI大模型探索之路-训练篇7:大语言模型Transformer库之HuggingFace介绍

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Web前端开发之CSS_2

关系选择器CSS盒子模型弹性盒子模型文档流浮动清除浮动定位 1. 关系选择器 1.1 后代选择器 E F{} 选择所有被 E 元素包含的 F 元素&#xff0c;中间用空格隔开 <ul> <li>后代列表1</li> <div> <ol> <li>后代列表2</li> </ol>…

20240428如何利用IDM下载磁链视频

缘起&#xff1a; https://weibo.com/tv/show/1034:4864336909500449 中国获奖独立纪录片《阿辉》揭秘红灯区“教父”的生存法则 5,751次观看 1年前 发布于 陕西 身为里中横 67.7万粉丝 互联网科技博主 微博原创视频博主 头条文章作者 https://weibo.com/tv/show/1034:4864…

深度学习:基于Keras框架,使用神经网络模型对葡萄酒类型进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

Docker如何开启远程访问?

Docker是一种开源的容器化平台&#xff0c;通过将应用程序和其依赖项打包成容器&#xff0c;可以实现快速部署、弹性运行和简化管理。默认情况下&#xff0c;Docker的运行环境是局域网内的单机&#xff0c;但有时我们需要在不同地区的电脑、设备之间进行远程通信。本篇文章将介…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测(Matlab)

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09; 目录 区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基…

web安全---xss漏洞/beef-xss基本使用

what xss漏洞----跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;攻击者在网页中注入恶意脚本代码&#xff0c;使受害者在浏览器中运行该脚本&#xff0c;从而达到攻击目的。 分类 反射型---最常见&#xff0c;最广泛 用户将带有恶意代码的url打开&a…

websocket 单点通信,广播通信

Websocket协议是对http的改进&#xff0c;可以实现client 与 server之间的双向通信&#xff1b; websocket连接一旦建立就始终保持&#xff0c;直到client或server 中断连接&#xff0c;弥补了http无法保持长连接的不足&#xff0c;方便了客户端应用与服务器之间实时通信。 参…

信息系统管理

目录 一、信息系统管理范围 1、规划和组织 2、设计和实施 ①、信息系统架构 Ⅰ、集中式架构 Ⅱ、分布式架构 Ⅲ、SOA&#xff08;面向服务的系统架构&#xff09; 3、运维和服务 ①、运行管理和控制 ②、IT服务管理 ③、运行与监控 Ⅰ、运行监控 Ⅱ、安全监控 4、…

【题解】—— LeetCode一周小结17

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结16 22.组合总和 Ⅳ 题目链接&#xff1a;377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数…

01.Kafka简介与基本概念介绍

1 Kafka 简介 Kafka 是最初由 Linkedin公司开发&#xff0c;是一个分布式、支持分区(partition)的、多副本(replica)的&#xff0c;基于 Zookeeper 协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff1a;比如基于 hadoop 的…

SpringBoot 快速开始 Dubbo RPC

文章目录 SpringBoot 快速开始 Dubbo RPC下载 Nacos项目启动项目的创建创建主项目接口定义服务的创建Dubbo 服务提供者的创建服务的消费者创建 添加依赖给 Provider、Consumer 添加依赖 开始写代码定义接口在 Provider 中实现在 Consumer 里面使用创建启动类 注册中心配置启动 …

R-Tree: 原理及实现代码

文章目录 R-Tree: 原理及实现代码1. R-Tree 原理1.1 R-Tree 概述1.2 R-Tree 结构1.3 R-Tree 插入与查询 2. R-Tree 实现代码示例&#xff08;Python&#xff09;结语 R-Tree: 原理及实现代码 R-Tree 是一种用于管理多维空间数据的数据结构&#xff0c;常用于数据库系统和地理信…

党建3d互动虚拟现实网上展厅有何优势?

在数字化浪潮席卷全球的今天&#xff0c;企业如何迅速踏上虚拟世界的征程&#xff0c;开启元宇宙之旅?答案就是——3D虚拟云展。这一创新平台&#xff0c;华锐视点以虚拟现实技术和3D数字建模为基石提供3D云展搭建服务&#xff0c;助力企业轻松搭建起虚拟数字基础设施&#xf…

Rust Web开发实战:打造高效稳定的服务端应用

Rust Web开发实战&#xff1a;打造高效稳定的服务端应用 本书将带领您从零开始构建Web应用程序&#xff0c;无论是API、微服务还是单体应用&#xff0c;都将一一涵盖。您将学到如何优雅地对外开放API&#xff0c;如何连接数据库以安全存储数据&#xff0c;以及如何对应用程序进…

用结构体把驱动层和应用层分开

用正点原子代码的usmart分析&#xff0c;如下&#xff1a; usmart.h usmart_config.c 实例&#xff1a;把结构体与具体驱动绑定一起 /* 正点原子的usmart串口的封装 涉及文件&#xff1a;usmart.h usmart.c usmart_config.c 还有外面使用的文件&#xff08;应用层调用&#xff…

Rocketmq 5 分级存储 Tieredstore(RIP-57、RIP-65) 原理详解 源码解析

1. 背景 RocketMQ 5.x 的演进目标之一是云原生化&#xff0c;在云原生和 Serverless 的浪潮下&#xff0c;需要解决 RocketMQ 存储层存在两个瓶颈。 数据量膨胀过快&#xff0c;单体硬件无法支撑存储的低成本和速度无法兼得 众多云厂商也希望提供 Serverless 化的 RocketMQ …