手势:
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;
}