手势、鼠标滑动实现界面切换
手势:
#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;
}