Qt实现播放器顶部、底部悬浮工具栏

未实现时的播放器界面

下面是实现了雏形的悬浮栏:

设计一个播放器的悬浮工具栏旨在提升用户的交互体验,使得播放器在不影响观感的情况下提供常用功能。为此,我们可以新建一个QWidget窗口作为悬浮工具栏,将其作为播放器窗口的子控件,以便实现灵活的显示和隐藏,同时利用透明度调节带来更具现代感的视觉效果。以下是具体的设计思路:

1. 悬浮工具栏的布局与功能设计

悬浮工具栏通常包含播放、暂停、进度条、音量控制、全屏切换等基础功能按钮。工具栏的布局应简洁、紧凑,便于用户一眼就找到所需的功能。可以采用水平布局,所有控件在一个水平行中排列,这样可以节省空间,符合播放器的视觉设计需求。此外,为了增强交互性,可以在悬浮栏上方添加提示文本,鼠标悬停时显示对应功能的提示,帮助用户快速上手。

2. 显示和隐藏逻辑

为了使悬浮工具栏在不操作时不打扰用户观影体验,我们可以设置当鼠标进入播放器窗口时显示工具栏,离开时自动隐藏。实现上,可以通过捕获播放器窗口的鼠标事件来控制悬浮工具栏的显隐。例如,使用enterEvent()leaveEvent()事件来分别显示和隐藏悬浮栏。这种设计可以确保用户在需要时快速找到工具栏,在不需要时工具栏自动消失,避免界面过于杂乱。

3. 悬浮效果与透明度调节

为了提升工具栏的视觉观感,可以为悬浮栏设置半透明效果,使其在播放器界面中呈现悬浮效果。透明度调节可以通过设置窗口的不透明度属性实现,例如使用setWindowOpacity()方法。通常可以将透明度设置为50%-80%之间,这样既不影响工具栏的可见性,又不遮挡播放器画面。此外,可以通过逐渐调节透明度来实现淡入淡出的动画效果,进一步提升悬浮栏的动态表现。

4. 悬浮栏的创建与嵌入

悬浮工具栏需要作为播放器窗口的子控件创建,这样可以确保它随播放器一起显示和关闭。具体实现上,可以创建一个继承自QWidget的悬浮工具栏类,将其添加为播放器窗口的子窗口,并设定为无边框窗口,以避免影响播放器窗口的边框和布局。悬浮工具栏可以通过Qt::FramelessWindowHint等属性来隐藏边框,Qt::ToolTip属性可以将其置于播放器窗口的顶层,保证其不被其他窗口遮挡。

5. 响应用户交互

作为播放器的一部分,悬浮工具栏应能实时响应用户的交互需求,比如鼠标进入和点击操作,保持操作的流畅性。可以通过设置合适的事件过滤器来捕获和处理用户的点击事件,确保悬浮栏在点击按钮时不发生其他意外隐藏。通过这一设计,悬浮工具栏将具备流畅的显示隐藏效果、出色的半透明悬浮效果和紧凑的功能布局,为播放器提供更具现代感的交互体验。


代码如下:

#include <QApplication>
#include <QOpenGLWidget>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>

class FloatingToolbar : public QWidget {
    Q_OBJECT

public:
    FloatingToolbar(QWidget *parent = nullptr) : QWidget(parent) {
        // 设置为顶层窗口
        setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);
        setWindowOpacity(0.8);  // 设置透明度

        // 创建布局管理器
        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->setContentsMargins(10, 10, 10, 10);  // 设置边距

        // 创建左侧按钮
        QPushButton *button1 = new QPushButton("功能1", this);

        // 创建右侧按钮
        QPushButton *button2 = new QPushButton("功能2", this);
        QPushButton *button3 = new QPushButton("功能3", this);

        // 添加左侧按钮
        layout->addWidget(button1);

        // 添加弹簧,将按钮分隔开
        layout->addStretch();

        // 添加右侧按钮
        layout->addWidget(button2);
        layout->addWidget(button3);

        // 设置布局
        setLayout(layout);
    }

    void resizeToBottomOfParent() {
        if (parentWidget()) {
            setGeometry(parentWidget()->geometry().adjusted(0, parentWidget()->height() - height(), 0, 0));
        }
    }
};

class VideoPlayer : public QOpenGLWidget {
    Q_OBJECT

public:
    VideoPlayer(QWidget *parent = nullptr) : QOpenGLWidget(parent) {
        // 创建悬浮工具栏并设置父窗口
        toolbar = new FloatingToolbar(this);  // 将VideoPlayer实例设置为toolbar的父窗口
        toolbar->setFixedHeight(50);           // 设置工具栏高度
        toolbar->hide();                        // 初始隐藏工具栏
    }

protected:
    void enterEvent(QEvent *event) override {
        toolbar->show();                       // 鼠标进入时显示工具栏
        toolbar->resizeToBottomOfParent();     // 调整工具栏的位置
        QOpenGLWidget::enterEvent(event);
    }

    void leaveEvent(QEvent *event) override {
        toolbar->hide();                       // 鼠标离开时隐藏工具栏
        QOpenGLWidget::leaveEvent(event);
    }

    void resizeEvent(QResizeEvent *event) override {
        QOpenGLWidget::resizeEvent(event);
        toolbar->resizeToBottomOfParent();     // 窗口大小改变时调整工具栏
    }

private:
    FloatingToolbar *toolbar;  // 工具栏作为成员变量
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    VideoPlayer player;
    player.resize(800, 600);  // 设置视频窗口大小
    player.show();

    return app.exec();
}

这只是底部的悬浮栏雏形代码,可以通过创建新的窗口,调整位置,增加空间来做顶部悬浮栏,异曲同工

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-概念、安装、基本配置

文章目录 一、Redis及Redis集群概念、分布式系统概念一-1 Redis是什么&#xff1f;一-2 什么是分布式系统及其特性&#xff1f;一-3 什么是Redis集群以及实现的方法介绍&#xff1f;哨兵模式(sentinel)&#xff1f;cluster&#xff1f;&#xff1f; 一-4 Redis的库&#xff1f;…

大语言模型驱动的跨域属性级情感分析——论文阅读笔记

前言 论文PDF下载地址&#xff1a;7156 最近想搜一下基于大语言模型的情感分析论文&#xff0c;搜到了这篇在今年发表的论文&#xff0c;于是简单阅读之后在这里记一下笔记。 如图1所示&#xff0c;在餐厅领域中的"快"是上菜快&#xff0c;属于正面情感&#xff0c;但…

2022 icpc南京(I,G,A,D,M,B)

文章目录 [I. Perfect Palindrome](https://codeforces.com/gym/104128/problem/I)[G. Inscryption](https://codeforces.com/gym/104128/problem/G)[A.Stop, Yesterday Please No More](https://codeforces.com/gym/104128/problem/A)[D. Chat Program](https://codeforces.co…

来电显示单位名称怎么设置?

在现代商务沟通中&#xff0c;来电显示单位名称已成为提升企业形象、增强客户信任的重要工具。想象一下&#xff0c;当拨打或接听电话时&#xff0c;如果对方的手机屏幕上能够显示出企业的单位名称和品牌标识&#xff0c;会有什么样的效果呢&#xff1f;毋庸置疑&#xff0c;这…

图为大模型一体机新探索,赋能智能家居行业

在21世纪的今天&#xff0c;科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网&#xff0c;从大数据到人工智能&#xff0c;每一项技术创新都在为人类带来前所未有的便利与效率。其中&#xff0c;图为AI大模型一体机作为人工智能领域的最新成果&#…

【Linux学习】(9)调试器gdb

前言 Linux基础工具&#xff1a;安装软件我们用的是yum&#xff0c;写代码用的是vim&#xff0c;编译代码用gcc/g&#xff0c;调试代码用gdb&#xff0c;自动化构建用make/Makefile&#xff0c;多人协作上传代码到远端用的是git。 在前面我们把yum、vim、gcc、make、git都已经学…

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 2)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Leecode热题100-226.反转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代&#xff0c;社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一&#xff0c;Facebook不断致力于人工智能&#xff08;AI&#xff09;的研究与应用&#xff0c;以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…

PHP计件工资平台系统小程序源码

&#x1f4bc;提升效率&#xff0c;精准计薪 ——「计件工资系统」全解析&#x1f4bc; &#x1f4ca;【告别繁琐&#xff0c;一键统计】&#x1f4ca; 你是否还在为每个月的计件工资统计而烦恼&#xff1f;繁琐的数据录入、核对&#xff0c;不仅耗时耗力&#xff0c;还容易出…

ClickHouse 3节点集群安装

ClickHouse 简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官方网站&#xff1a;https://clickhouse.com/ 项目地址&#xff1a;https://github.com/ClickHouse/ClickHouse 横向扩展集群介绍 此示例架构旨在提供可扩展性。它包括三个节点&#xff…

机器学习课程学习周报十八

机器学习课程学习周报十八 文章目录 机器学习课程学习周报十八摘要Abstract一、机器学习部分1. 再探Diffusion的数学原理1.1 回顾生成模型的任务1.2 DDPM (Denoising Diffusion Probabilistic Models)1.3 DDPM的证据下界 总结 摘要 本周周报深入探讨了Diffusion模型的数学原理…

JsonCpp库学习记录

使用源码的方式 到JsonCpp的开源库仓库下载最新的发行版本 解压压缩包 使用Python生成源码文件 在本路径下cmd打开控制台&#xff0c;使用python编译&#xff08;前提是python环境已安装&#xff09; python amalgamate.py 生成dist文件夹 jsoncpp为整合在一起的源码&#…

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网&#xff0c;eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一&#xff1a;vlan演示&#xff08;交换机端口access模式&#xff09;2、实验二&#xff1a;vlan演示&#xff08;交换机端口trunk模式&#xff09; 一、概念 VLAN&#xff08;Virtual Local Area Ne…

vmware运维技巧总结

vmware使用实践总结 技巧一、在线添加硬盘技巧二、lvm脚本挂载硬盘 技巧一、在线添加硬盘 适用于不重启vmware虚拟机添加硬盘 首先控制台新加一块100G的硬盘 此时虚拟机内部是识别不到的&#xff0c;lsblk查看如下 不重启的情况下&#xff0c;采用如下方案 步骤一、查找主机…

智慧港口大屏可视化产品原型设计

全球贸易的快速发展和技术的不断进步&#xff0c;港口作为国际贸易的重要枢纽&#xff0c;其运营效率和管理水平直接影响到全球供应链的顺畅。智慧港口的概念应运而生&#xff0c;旨在通过新一代信息技术&#xff0c;将港口相关业务和管理创新深度融合&#xff0c;实现港口的高…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端&#xff1a;详细指南 初识 Qt 和 gRPC 什么是 Qt&#xff1f;什么是 gRPC&#xff1f; 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

利用Django实现MySQL数据库的内容在网页的增删改写

利用Django实现MySQL数据库的内容在网页的增删改写 1.建立项目2.定义模型3.创建视图4.创建模板5.创建表单和配置url6.最后修改7.效果 1.建立项目 输入命令django-admin startproject aaa 新建项目&#xff0c;项目名称命名为aaa&#xff0c;打开aaa文件夹&#xff0c;命令提示…

vscode 安装教程

双击vscode 安装包 同意&#xff0c;下一步 可以使用默认安装路径&#xff0c;也可以优化为这个 全选 取消勾选&#xff0c;点完成 在桌面创建一个空文件夹&#xff0c;拖动到vscode图标上 点击这个图标创建文件&#xff0c;注意必须以.py 结尾&#xff01;&#xff0…

第三十二篇:TCP协议粘包和滑动窗口,TCP系列七

上一篇《第三十一篇&#xff1a;TCP协议如何解决丢包的问题&#xff0c;TCP系列六》讲了TCP如何解决丢包问题&#xff0c;本文将为大家讲解TCP是如何提高传输效率&#xff0c;减少传输时延的原理。 1. TCP是如何提高传输效率&#xff0c;减少传输时延的 ① 粘包 如果传输的数…