Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。
首先,我们使用Qt ui 画出两个QStackedWidget的两个页面
要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)
就行。
那么如何自动调用呢?
这时候,我们想到网页的正常操作。当鼠标在某个区悬浮超过固定时间时,将按钮显示出来,也就是切换页面。
这里我们遇到了个坑, Qt为了缩减资源消耗,只在鼠标按下才触发
mouseMoveEvent!
切记修改MouseTracking属性,我们修改了整个ui的MouseTracking属性发现没有用???
查资料,需要将所有QWidget子节点全部赋值!
void setMouseTrackingRecursively(QWidget* widget) {if (widget == nullptr)return;widget->setMouseTracking(true);const QObjectList& children = widget->children();for (QObject* child : children) {if (child->isWidgetType()) {setMouseTrackingRecursively(qobject_cast<QWidget*>(child));}}
}
实现完成,发现还行,但是缺少点灵魂,动画太直接了。
好的,加动画属性:#include <QPropertyAnimation>
这玩意太多功能了,后期单独在写。
直接上代码:
endListDialog.h
#ifndef ENDLISTDIALOG_H
#define ENDLISTDIALOG_H#include <QDialog>
#include <QDebug>
namespace Ui {
class endListDialog;
}class endListDialog : public QDialog
{Q_OBJECTpublic:explicit endListDialog(QWidget *parent = nullptr);~endListDialog();private slots:void onHoverTimeout();
protected:void mouseMoveEvent(QMouseEvent *event);void switchPage(int index);
private:Ui::endListDialog *ui;bool isHovering;QTimer *timer;
};#endif // ENDLISTDIALOG_H
endListDialog.cpp
#include "endlistdialog.h"
#include "ui_endlistdialog.h"
#include <QTimer>
#include <QMouseEvent>
#include <QMessageBox>
#include <QPropertyAnimation>
bool bshow=false;//鼠标事件mouseMoveEvent必须按下才响应 为了实现将页面所有QWidget setMouseTracking属性赋值true
void setMouseTrackingRecursively(QWidget* widget) {if (widget == nullptr)return;widget->setMouseTracking(true);const QObjectList& children = widget->children();for (QObject* child : children) {if (child->isWidgetType()) {setMouseTrackingRecursively(qobject_cast<QWidget*>(child));}}
}//同理QWidget 透明设置
void setwindowOpacityRecursively(QWidget* widget) {if (widget == nullptr)return;widget->setMouseTracking(true);const QObjectList& children = widget->children();for (QObject* child : children) {if (child->isWidgetType()) {setwindowOpacityRecursively(qobject_cast<QWidget*>(child));}}
}/****************************/
//切换页面实现
//入参 index 页面 (这里偷懒直接写了固定的实现)
//输出
/****************************/
void endListDialog::switchPage(int index)
{//我的ui QStackedWidget对象是stackedWidget_18,换成自己的QWidget *currentWidget = ui->stackedWidget_18->currentWidget();QWidget *nextWidget = ui->stackedWidget_18->widget(index);// 创建动画// 创建缩小动画QPropertyAnimation *fadeOutAnimation = new QPropertyAnimation(currentWidget, "geometry");fadeOutAnimation->setDuration(200);QRect originalGeometry = currentWidget->geometry();QRect targetGeometry;if(index==1){ //展示第二页时 将第一页缩小一点 targetGeometry = QRect(originalGeometry.x() +20,originalGeometry.y() ,originalGeometry.width()-40,originalGeometry.height());}else{//展示第一页时 将第二页放大一点 targetGeometry = QRect(originalGeometry.x() -20,originalGeometry.y() ,originalGeometry.width()+40,originalGeometry.height());}fadeOutAnimation->setStartValue(originalGeometry);fadeOutAnimation->setEndValue(targetGeometry);QPropertyAnimation *fadeInAnimation = new QPropertyAnimation(nextWidget, "windowOpacity");fadeInAnimation->setDuration(600);fadeInAnimation->setStartValue(0.0);fadeInAnimation->setEndValue(1.0);// 连接动画完成信号connect(fadeOutAnimation, &QPropertyAnimation::finished, this, [this, index]() {ui->stackedWidget_18->setCurrentIndex(index);});// 启动动画fadeOutAnimation->start();fadeInAnimation->start();
}endListDialog::endListDialog(QWidget *parent) :QDialog(parent),ui(new Ui::endListDialog)
{ui->setupUi(this);isHovering = false;timer = new QTimer();timer->setInterval(200); // 设置为 600 m秒connect(timer, &QTimer::timeout, this, &endListDialog::onHoverTimeout);setMouseTrackingRecursively(ui->widget);setwindowOpacityRecursively(ui->widget);
}endListDialog::~endListDialog()
{delete ui;
}//mouseMoveEvent的重写 ,千万记住setMouseTracking属性赋值true
//不然你只能按住才能触发 Qt为了缩减资源消耗默认赋值false
void endListDialog::mouseMoveEvent(QMouseEvent *event) {// 检查鼠标是否在 stackedWidget 内if (ui->stackedWidget_18->underMouse()) {// 鼠标在 stackedWidget 内部qDebug("Mouse is inside the stackedWidget");if (!isHovering) { // 仅在未悬浮时启动计时器isHovering = true;bshow=false;timer->start();}} else {// 鼠标不在 stackedWidget 内部qDebug("Mouse is outside the stackedWidget");if (isHovering) { // 仅在悬浮时停止计时器isHovering = false;timer->stop();switchPage(0);}}// 调用基类的 mouseMoveEventQDialog::mouseMoveEvent(event);
}void endListDialog::onHoverTimeout() {// 在这里执行悬浮超过3秒后的操作// 例如,显示提示信息// QMessageBox::information(this, "提示", "鼠标悬浮超过3秒!");if(!bshow){switchPage(1);bshow = true;}
}
相关文章:

Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...

table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
Linux使用笔记:Find Tree 命令
Tree 命令的使用 使用-I 参数,过滤掉不想展未的目录或文件使用-L参数,指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令
数据库 主流数据库 关系型数据库 MySQL:开源免费的关系型数据库,易于使用和学习,支持大型企业级应用。其特点包括高性能、可靠性和可扩展性,支持多种编程语言和操作系统,拥有大量的社区支持和插件SQLite:…...

汽车材料耐候性测试仪器-太阳光模拟器介绍
**太阳光模拟器**是一种用于模拟太阳光谱的设备,广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线,评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**: - **氙灯**:最常用的光源&…...

音频3A测试--AEC(回声消除)测试
一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
六、Redis 高级功能详解:BitMap、HyperLogLog、Geo、Stream
Redis 高级功能详解:BitMap、HyperLogLog、Geo、Stream Redis 不仅提供了基础的数据结构(String、List、Set、Hash、Sorted Set),还提供了一些高级数据结构,专门用于特定的应用场景,如位运算统计、去重计数、地理位置存储、流数据处理等。本文将详细介绍这些高级功能的使…...

WSL下使用git克隆失败解决
WSL默认nat模式,别动了防火墙放行,见图1git导入[bash1],ip为你wsl上linxu通过ifconfig获取的本机ip,端口对好某alcsh软件开启tun模式【经过测试,不开也行】应该成了,如果不行,修改.wslconfig为下…...
【Elasticsearch】索引生命周期管理相关的操作(Index Lifecycle Actions)
Elasticsearch 的Index Lifecycle Management(ILM)是一种用于管理索引生命周期的工具,它允许用户根据索引的使用阶段(如热、温、冷、冻结)自动执行一系列操作。以下是详细解释 Elasticsearch 中的索引生命周期操作(Index Lifecycl…...
TS的接口 泛型 自定义类型 在接口中定义一个非必须的属性
TS的接口 泛型 自定义类型 接口 新建一个ts文件,在里面定义一个接口 export interface PersonInter{id:string,name:string,age:number }在vue文件中引入这个ts文件 <script lang"ts" setup name"Person">import {type PersonInter} …...

Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台
2025-02-27,由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境,设计了更具挑战性和实用性的交互任务,目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来,基于大型语言模型的智能体系统在复…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...