当前位置: 首页 > news >正文

手势、鼠标滑动实现界面切换

手势:

#include <QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStackedWidget>
#include <QGestureEvent>
#include <QPanGesture>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:bool event(QEvent *event) override;bool gestureEvent(QGestureEvent *event);private:QStackedWidget *stackedWidget;void setupUI();
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QWidget>
#include <QGesture>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{setupUI();grabGesture(Qt::PanGesture);
}MainWindow::~MainWindow()
{
}void MainWindow::setupUI()
{// 创建中央部件QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);// 创建布局QVBoxLayout *layout = new QVBoxLayout(centralWidget);// 创建堆叠部件stackedWidget = new QStackedWidget(this);layout->addWidget(stackedWidget);// 创建三个示例页面QWidget *page1 = new QWidget();QWidget *page2 = new QWidget();QWidget *page3 = new QWidget();// 为每个页面添加标签QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("Page 1", page1);label1->setAlignment(Qt::AlignCenter);layout1->addWidget(label1);QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("Page 2", page2);label2->setAlignment(Qt::AlignCenter);layout2->addWidget(label2);QVBoxLayout *layout3 = new QVBoxLayout(page3);QLabel *label3 = new QLabel("Page 3", page3);label3->setAlignment(Qt::AlignCenter);layout3->addWidget(label3);// 将页面添加到堆叠部件stackedWidget->addWidget(page1);stackedWidget->addWidget(page2);stackedWidget->addWidget(page3);// 设置窗口大小resize(400, 300);
}bool MainWindow::event(QEvent *event)
{if (event->type() == QEvent::Gesture)return gestureEvent(static_cast<QGestureEvent*>(event));return QMainWindow::event(event);
}bool MainWindow::gestureEvent(QGestureEvent *event)
{if (QGesture *pan = event->gesture(Qt::PanGesture)) {QPanGesture *panGesture = static_cast<QPanGesture*>(pan);QPointF delta = panGesture->delta();// 检测水平滑动if (qAbs(delta.x()) > qAbs(delta.y())) {int currentIndex = stackedWidget->currentIndex();int count = stackedWidget->count();if (delta.x() > 0 && currentIndex > 0) {// 向右滑动,显示上一页stackedWidget->setCurrentIndex(currentIndex - 1);} else if (delta.x() < 0 && currentIndex < count - 1) {// 向左滑动,显示下一页stackedWidget->setCurrentIndex(currentIndex + 1);}return true;}}return false;
}

鼠标:

#include <QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStackedWidget>
#include <QPoint>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:QStackedWidget *stackedWidget;QPoint lastMousePos;bool isDragging;int dragThreshold;  // 拖动阈值,超过这个值才触发页面切换void setupUI();
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QWidget>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), isDragging(false), dragThreshold(50)  // 设置拖动阈值为50像素
{setupUI();
}MainWindow::~MainWindow()
{
}void MainWindow::setupUI()
{// 创建中央部件QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);// 创建布局QVBoxLayout *layout = new QVBoxLayout(centralWidget);// 创建堆叠部件stackedWidget = new QStackedWidget(this);layout->addWidget(stackedWidget);// 创建三个示例页面QWidget *page1 = new QWidget();QWidget *page2 = new QWidget();QWidget *page3 = new QWidget();// 为每个页面添加标签和背景色QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("Page 1", page1);label1->setAlignment(Qt::AlignCenter);label1->setStyleSheet("QLabel { font-size: 24px; }");layout1->addWidget(label1);page1->setStyleSheet("background-color: #FFE4E1;");  // 浅粉色背景QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("Page 2", page2);label2->setAlignment(Qt::AlignCenter);label2->setStyleSheet("QLabel { font-size: 24px; }");layout2->addWidget(label2);page2->setStyleSheet("background-color: #E0FFFF;");  // 浅青色背景QVBoxLayout *layout3 = new QVBoxLayout(page3);QLabel *label3 = new QLabel("Page 3", page3);label3->setAlignment(Qt::AlignCenter);label3->setStyleSheet("QLabel { font-size: 24px; }");layout3->addWidget(label3);page3->setStyleSheet("background-color: #F0FFF0;");  // 浅绿色背景// 将页面添加到堆叠部件stackedWidget->addWidget(page1);stackedWidget->addWidget(page2);stackedWidget->addWidget(page3);// 设置窗口大小resize(400, 300);
}void MainWindow::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {lastMousePos = event->pos();isDragging = true;}
}void MainWindow::mouseMoveEvent(QMouseEvent *event)
{if (!isDragging) return;QPoint currentPos = event->pos();int deltaX = currentPos.x() - lastMousePos.x();// 如果水平移动距离超过阈值,则移动当前页面if (qAbs(deltaX) > dragThreshold) {int currentIndex = stackedWidget->currentIndex();int count = stackedWidget->count();if (deltaX > 0 && currentIndex > 0) {// 向右拖动,显示上一页stackedWidget->setCurrentIndex(currentIndex - 1);isDragging = false;} else if (deltaX < 0 && currentIndex < count - 1) {// 向左拖动,显示下一页stackedWidget->setCurrentIndex(currentIndex + 1);isDragging = false;}}
}void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{isDragging = false;
}
http://www.dtcms.com/a/177780.html

相关文章:

  • mysql数据库初体验
  • java集成telegram机器人
  • 软件设计师教程——第一章 计算机系统知识(上)
  • python 上海新闻爬虫
  • vue-grid-layout实现拖拽修改工作台布局
  • Qt/C++开发监控GB28181系统/警情订阅/目录订阅/报警事件上报/通道上下线
  • <template>标签的用法
  • 基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(下)
  • FastExcel 本地开发和Linux上上传Resource文件的差异性
  • kotlin JvmName注解的作用和用途
  • 游戏引擎学习第264天:将按钮添加到分析器
  • VTK|.obj文件数据处理+Jet/Viridis/CoolToWarm/Grayscale/Rainbow/风格颜色渲染
  • 如何使用极狐GitLab 软件包仓库功能托管 helm chart?
  • 实践005-Gitlab CICD全项目整合
  • Java并发编程几个问题的解答
  • 在登录页面上添加验证码
  • 超详细!RxSwift 中的 BehaviorRelay 使用教程(含原理 + 示例 + 实战)
  • NetSuite 如何得到所有Item最近一次采购订单的货品单价?
  • 不再踩坑!React.memo正确用法及性能优化实战
  • AI时代企业应用系统架构的新思路与CIO变革指南
  • 21、魔法传送阵——React 19 文件上传优化
  • 轻量级证件照制作 AI 工具 HivisionIDPhotos 介绍
  • 单片机自动排列上料控制程序 下
  • DSP28335 串口中断收发及FIFO使用
  • 剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性
  • 国内云内网接入方案
  • JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码
  • linux中的常用命令(一)
  • 运维打铁:服务器分类及PHP入门
  • ElasticSearch基本概念