首页 > 其他分享 >QT桌面(实现界面的滑动切换)

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

时间:2023-06-09 12:32:55浏览次数:43  
标签:桌面 QT 翻页 event QWidget Home 滑动 stackedLayout Page

(文章目录)


前言

在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);
}

总结

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

标签:桌面,QT,翻页,event,QWidget,Home,滑动,stackedLayout,Page
From: https://blog.51cto.com/u_16153875/6446755

相关文章

  • QT圆形进度条(桌面项目光照强度检测)
    (文章目录)前言本篇文章我们讲解QT实现圆形进度条,并实现动态的效果。一、编程思路实现QT圆形进度条其实是非常简单的,思路就是画两个圆弧。这里大家就会觉得很奇怪了为什么画两个圆弧就能实现圆形进度条了呢?那么下面我们一个个圆弧来画看看效果。代码:painter.translate(......
  • QT中的动画类(QPropertyAnimation)
    (文章目录)前言QPropertyAnimation是QT中的一个动画类,用于对目标对象的属性进行动画效果展示。该类继承自QAbstractAnimation类,使用起来非常方便和灵活。一、QPropertyAnimation类介绍QPropertyAnimation可以对任何QObject的子类的属性进行动画的展示,只要该属性是可写的,即存在......
  • QT Error
    环境:QT6.5,VS2022,QTVisualStudioTool2.10.11.QTCustomDesignerWidget无法显示到WidgetBox中的解决方案:QDESIGNER_WIDGET_EXPORT需要将生成的dll和lib放置到目录D:\Qt\6.5.1\msvc2019_64\plugins\designer下,重启QT即可。#include<QtWidgets/QWidget>#incl......
  • Qt MDI及其使用方法(详解版)
    统的应用程序设计中有多文档界面(Multi-documentInterface,MDI)应用程序,Qt为设计MDI应用程序提供了支持。本节的实例samp6_4是一个MDI应用程序,程序运行效果如图1所示。 图1MDI应用程序实例samp6_4的运行时界面MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口......
  • Qt元对象和属性系统详解
    Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。本节将介绍Qt的这些核心特点,对于理解和编写高效的QtC++程序是大有帮助的。 Qt的元对象系统Qt的元对象系统(Meta-ObjectSystem)提供......
  • Linux下Qt创建共享库与链接共享库详解
    随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。 共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是......
  • qt work
    autofolder1="./.mm";QDir*folder=newQDir;boolexist=folder->exists(folder1);if(exist){QMessageBox::warning(this,tr("createDir"),tr("Dirisalreadyexisted!"));}......
  • 【LeetCode滑动窗口专题#2】无重复字符的最长子串
    #1传送门滑动窗口最大值长度最小的子数组无重复字符的最长子串给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:......
  • Flexslider图片轮播、文字图片相结合滑动切换效果
    Flexslider是一款基于的jQuery内容滚动插件。它能让你轻松的创建内容滚动的效果,具有非常高的可定制性。开发者可以使用Flexslider轻松创建各种图片轮播效果、焦点图效果、图文混排滚动效果。查看演示DEMO下载源码Flexslider具有以下特性:支持滑动和淡入淡出效果。支持水平、......
  • Qt之MQTT编译(一)
    一、MQTT简介MQTT(MessageQueuingTelemetryTransport)是一种轻量级的、发布-订阅模式的消息传输协议。它最初是为低带宽和不稳定网络环境设计的,以支持物联网(IoT)设备之间的高效通信。MQTT的工作方式基于发布-订阅模型,其中包含两个角色:发布者(Publisher)和订阅者(Subscriber)。发......