QT桌面(实现界面的滑动切换)

news/2024/7/8 3:19:20 标签: qt, 开发语言

文章目录

  • 前言
  • 一、使用QStackedLayout管理主界面
  • 二、重写鼠标处理事件
  • 总结


前言

在ARM Linux中使用QT如何实现滑动翻页切换界面的效果呢?在ARM中是没有自带的鼠标的,那么我们如何实现滑动翻页呢?经过测试发现在ARM中运行QT程序也是可以通过重写鼠标事件来捕获触屏动作的,在ARM中滑动屏幕被定义成了鼠标左键事件,那么这样就有思路了,重写鼠标事件

一、使用QStackedLayout管理主界面

这里使用QStackedLayout来管理创建出来的几个主界面,这里我创建三个主界面。并且使用QStackedLayout将这几个界面管理起来。

    QStackedLayout* m_stackedLayout;
    QWidget* Home_Page_1;
    QWidget* Home_Page_2;
    QWidget* Home_Page_3;
	
    m_stackedLayout = new QStackedLayout(this);
    Home_Page_1 = new QWidget();
    Home_Page_2 = new QWidget();
    Home_Page_3 = new QWidget();
    m_stackedLayout->addWidget(Home_Page_1);
    m_stackedLayout->addWidget(Home_Page_2);
    m_stackedLayout->addWidget(Home_Page_3);

编写主界面初始化函数:
这里有三个主界面故需要三个界面初始化函数。
这里可以先做的简单一点,在每个界面都创建一个按键或者标签进行区分。

/*主界面1*/
void Widget::InitHomePage1()
{
	QPushButton* button = new QPushButton(Home_Page_1);
	button->setText("I am page1");
}

/*主界面2*/
void Widget::InitHomePage1()
{
	QPushButton* button = new QPushButton(Home_Page_2);
	button->setText("I am page2");
}

/*主界面3*/
void Widget::InitHomePage3()
{
	QPushButton* button = new QPushButton(Home_Page_3);
	button->setText("I am page3");
}

二、重写鼠标处理事件

滑动包括按下、移动、和释放三个步骤故需要重写下面的三个鼠标事件。

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

需要的参数:
这里需要将按下的起始坐标和结束坐标都记录下来,最后做一个计算判断是否要进行翻页。

    int m_startPosX;
    int m_curPosX;

鼠标事件核心代码:
1.在按下屏幕的时候需要记录下按下的x坐标

2.这部分主要就是借助QStackedLayout和QPropertyAnimation来进行操作。

当鼠标在当前窗口内向右滑动超过30个像素时,会执行"向右翻页"操作;当鼠标向左滑动超过30个像素时,会执行"向左翻页"操作。

具体来说,该函数首先计算鼠标移动的位移差(delta),然后根据位移差的正负判断执行哪种翻页操作。

如果是向右翻页操作,会获取当前显示的窗口对象(currentWidget)和上一个窗口对象(prevWidget),并分别创建两个QPropertyAnimation对象,设置移动动画的起始和终止位置,以及动画的持续时间。然后,当前窗口对象会执行向右移动的动画,同时设置上一个窗口对象的初始位置在当前窗口对象的左侧,再让上一个窗口对象执行从左向右移动的动画。最后,设置当前显示的窗口对象为上一个窗口对象。

如果是向左翻页操作,逻辑与向右翻页类似,只是获取的是下一个窗口对象(nextWidget),并让当前窗口对象先执行向左移动的动画,然后设置下一个窗口对象的初始位置在当前窗口对象的右侧,再让下一个窗口对象执行从右向左移动的动画。最后,设置当前显示的窗口对象为下一个窗口对象。

3.滑动结束后清空参数值

void Widget::mousePressEvent(QMouseEvent *event)
{
    m_startPosX = event->x();
    QWidget::mousePressEvent(event);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    // 鼠标移动事件
    m_curPosX = event->x();
    int delta = m_curPosX - m_startPosX; // 计算位移差
    if (delta > 30)
    {
        // 向右翻页操作
        int currentIndex = m_stackedLayout->currentIndex();
        if (currentIndex > 0) {
            QWidget *currentWidget = m_stackedLayout->currentWidget();
            QWidget *prevWidget = m_stackedLayout->widget(currentIndex - 1);
            QPropertyAnimation *animation = new QPropertyAnimation(currentWidget, "pos");
            animation->setDuration(500);
            animation->setStartValue(QPoint(0, 0));
            animation->setEndValue(QPoint(width(), 0));
            animation->start(QAbstractAnimation::DeleteWhenStopped);
            m_stackedLayout->setCurrentWidget(prevWidget);
            prevWidget->setGeometry(-width(), 0, width(), height());
            QPropertyAnimation *animation2 = new QPropertyAnimation(prevWidget, "pos");
            animation2->setDuration(500);
            animation2->setStartValue(QPoint(-width(), 0));
            animation2->setEndValue(QPoint(0, 0));
            animation2->start(QAbstractAnimation::DeleteWhenStopped);
        }
    }
    else if (delta < -30)
    {
        // 向左翻页操作
        int currentIndex = m_stackedLayout->currentIndex();
        if (currentIndex < m_stackedLayout->count() - 1) {
            QWidget *currentWidget = m_stackedLayout->currentWidget();
            QWidget *nextWidget = m_stackedLayout->widget(currentIndex + 1);
            QPropertyAnimation *animation = new QPropertyAnimation(currentWidget, "pos");
            animation->setDuration(500);
            animation->setStartValue(QPoint(0, 0));
            animation->setEndValue(QPoint(-width(), 0));
            animation->start(QAbstractAnimation::DeleteWhenStopped);
            m_stackedLayout->setCurrentWidget(nextWidget);
            nextWidget->setGeometry(width(), 0, width(), height());
            QPropertyAnimation *animation2 = new QPropertyAnimation(nextWidget, "pos");
            animation2->setDuration(500);
            animation2->setStartValue(QPoint(width(), 0));
            animation2->setEndValue(QPoint(0, 0));
            animation2->start(QAbstractAnimation::DeleteWhenStopped);
        }
    }


    // 保存当前位置
    m_startPosX = m_curPosX;

    QWidget::mouseMoveEvent(event);
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    // 鼠标释放事件
    m_startPosX = 0;
    m_curPosX = 0;
    QWidget::mouseReleaseEvent(event);
}

总结

学习完这篇文章大家就可以自己去实现翻页的效果啦,有没有感觉非常的炫酷呢。


http://www.niftyadmin.cn/n/356634.html

相关文章

03-AJAX-jQuery实现方式

1、$.ajax()&#xff1a;用于执行 Ajax 请求的最常用方法。它可以设置请求类型、请求 URL、请求参数等。 $.ajax({type: 请求类型,url: 请求 URL,data: { 请求数据 },dataType: 返回数据类型,beforeSend: function () {},success: function (response) {},error: function (XM…

ubuntu换镜像源(ubuntu换源)

ubuntu换镜像源&#xff08;ubuntu换源&#xff09; 文章目录 ubuntu换镜像源&#xff08;ubuntu换源&#xff09;1. 备份镜像源文件2. 根据不同 ubuntu 版本设置不同的镜像源2.1 focal 版本镜像源2.2 bionic 版本镜像源2.3 ubuntu 自带源&#xff1a; 参考文献 1. 备份镜像源文…

HTTPS和SSH的区别

这里写目录标题 1.什么是HTTPS&#xff1f;2.什么是SSH&#xff1f;3.两者的区别1.用途不同2.实现方式不同3.加密算法不同4.安全级别不同 4.总结 1.什么是HTTPS&#xff1f; HTTPS是一种网络通信协议&#xff0c;全称为“Hyper Text Transfer Protocol Secure”&#xff0c;即…

一、阿里云oss

文章目录 一、阿里云oss1、开通“对象存储OSS”服务1.1创建Bucket1.2上传默认头像1.3获取用户acesskeys 2、使用SDK文档3、文件服务实现3.1搭建service-oss模块3.1.1 搭建service-oss模块3.1.2 修改配置3.1.3 启动类3.1.4配置网关 3.2 测试SDK3.3封装service接口3.4封装control…

Laravel框架06:文件、迁移填充、会话、缓存

Laravel框架06&#xff1a;文件、迁移填充、会话、缓存 一、文件上传1. 文件上传表单2. 上传业务处理3. 全部代码 二、数据表的迁移与填充1. 迁移文件① 创建迁移文件② 编写迁移文件③ 执行迁移文件④ 回滚迁移文件 2. 填充&#xff08;种子&#xff09;文件① 创建填充文件②…

ES6(对象,数组,类型化数组)

对象 1&#xff0c;Object.is 用于判断两个值是否相等&#xff0c; 其内部实现类SameValue算法&#xff0c; 其行为类似于“” 但与“”不同的是 它认为两个NaN是相等的 而0&#xff0c;-0是不相等的 2&#xff0c;Object.assign 表示此方法可以将对象合并成一个 他的第一个…

Android进阶 View事件体系(一):概要介绍和实现View的滑动

Android进阶 View事件体系&#xff08;一&#xff09;&#xff1a;概要介绍和实现View的滑动 内容概要 本篇文章为总结View事件体系的第一篇文章&#xff0c;将介绍的内容主要有&#xff1a; 什么是View和ViewGroupAndroid中View的坐标轴手势检测和速度检测如何实现View的滑动…

使用决策树模型Titanic数据集预测

数据准备 可以通过以下链接获取数据集&#xff1a; 百度网盘 请输入提取码 共包含三个csv文件&#xff1a; 《train.csv》训练数据集&#xff0c;包含特征信息和标签(是否幸存) 《test.csv》 测试数据集&#xff0c; 只包含特征信息 《gender_submission.csv》测试数据集…