手势:
#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_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#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_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#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;}来源:CSDN 原文,首次发布于 2025-05-08。