下面是一个示例代码,演示了如何在控件中使用QStackedWidget
实现类似iPhone的主页界面的左右滑动效果:
#include <QtWidgets>
class CustomWidget : public QWidget {
public:
CustomWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 创建布局和控件
QHBoxLayout *layout = new QHBoxLayout(this);
// 创建 QStackedWidget
stackedWidget = new QStackedWidget(this);
// 添加页面到 QStackedWidget
for (int i = 0; i < 5; ++i) {
QLabel *label = new QLabel(QString("Page %1").arg(i + 1));
label->setAlignment(Qt::AlignCenter);
stackedWidget->addWidget(label);
}
layout->addWidget(stackedWidget);
// 设置手势识别事件过滤器
stackedWidget->installEventFilter(this);
}
protected:
bool eventFilter(QObject *obj, QEvent *event) override {
if (obj == stackedWidget && event->type() == QEvent::Gesture) {
return gestureEvent(static_cast<QGestureEvent*>(event));
}
return false;
}
bool gestureEvent(QGestureEvent *event) {
if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {
swipeTriggered(static_cast<QSwipeGesture *>(swipe));
return true;
}
return false;
}
void swipeTriggered(QSwipeGesture *gesture) {
if (gesture->state() == Qt::GestureFinished) {
if (gesture->horizontalDirection() == QSwipeGesture::LeftToRight)
previousPage();
else if (gesture->horizontalDirection() == QSwipeGesture::RightToLeft)
nextPage();
}
}
private slots:
void previousPage() {
int currentIndex = stackedWidget->currentIndex();
if (currentIndex > 0)
stackedWidget->setCurrentIndex(currentIndex - 1);
}
void nextPage() {
int currentIndex = stackedWidget->currentIndex();
if (currentIndex < stackedWidget->count() - 1)
stackedWidget->setCurrentIndex(currentIndex + 1);
}
private:
QStackedWidget *stackedWidget;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
CustomWidget customWidget;
customWidget.show();
return app.exec();
}
这个示例创建了一个自定义的QWidget,内部包含一个QHBoxLayout布局和一个QStackedWidget控件。在QStackedWidget中添加了5个页面(使用QLabel模拟),可以通过左右滑动手势来切换页面。主要逻辑位于gestureEvent和swipeTriggered函数中,用于识别并处理滑动手势事件。
希望这个示例对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问