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

手势:

cpp 复制代码
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}
cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStackedWidget>
#include <QGestureEvent>
#include <QPanGesture>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    bool event(QEvent *event) override;
    bool gestureEvent(QGestureEvent *event);

private:
    QStackedWidget *stackedWidget;
    void setupUI();
};

#endif // MAINWINDOW_H
cpp 复制代码
#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;
}

鼠标:

cpp 复制代码
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}
cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStackedWidget>
#include <QPoint>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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
cpp 复制代码
#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;
}
相关推荐
zwc32104320554 小时前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉
凉茶钱5 小时前
多态:从虚函数语法到虚表寻址,一次讲透动态绑定
开发语言·c++·多态
01二进制代码漫游日记5 小时前
[C++]之内存管理(一)
jvm·c++·学习
codebolt5 小时前
C++程序crash分析和内存检测
开发语言·c++
ShineWinsu5 小时前
对于Qt:QLabel常见属性的解析
c++·qt·面试·笔试·gui·标签·qlabel
zwc32104320556 小时前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
小徐不徐说6 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso6 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
Sakura_j_h_15 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
程序喵大人16 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型