我正在尝试使用幻灯片放映创建图像查看器应用。当用户点击播放按钮时,观看者开始在另一个窗口中显示带有幻灯片放映的图像。当用户点击停止按钮时,查看器停止显示图像。这部分成功完成。
但其余部分未成功完成。我想当用户在幻灯片放映屏幕上向左滑动时,它将返回到主页面屏幕,当用户在主页面屏幕上向右滑动时,它将返回到幻灯片放映屏幕。但是我的代码无法执行此类操作。屏幕只用一根手指没有响应,但用三根手指工作。我只知道Qt :: SwipeGesture作为QGestureRecognizer的一部分用三个手指而不是一个手指注册。请帮帮我。
主页面屏幕
幻灯片放映屏幕
代码:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileSystemModel>
#include "showpic.h"
#include <QBasicTimer>
#include <QTimer>
#include <QSwipeGesture>
#include <QGestureEvent>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
bool event(QEvent *event);
void swipeTriggered(QSwipeGesture *gesture);
bool gestureEvent(QGestureEvent *event);
private slots:
void tick();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
QFileSystemModel *model;
QString filesPath;
ShowPic *showpic;
QStringList filenames;
QStringList::const_iterator m_imageIt;
QTimer m_timer;
};
#endif // MAINWINDOW_H
showpic.h
#ifndef SHOWPIC_H
#define SHOWPIC_H
#include <QWidget>
#include <QSwipeGesture>
#include <QGestureEvent>
namespace Ui {
class ShowPic;
}
class ShowPic : public QWidget
{
Q_OBJECT
public:
explicit ShowPic(QWidget *parent = 0);
~ShowPic();
public:
void addPixmap(const QPixmap &pixmap);
bool event(QEvent *event);
void swipeTriggered(QSwipeGesture *gesture);
bool gestureEvent(QGestureEvent *event);
private:
Ui::ShowPic *ui;
};
#endif // SHOWPIC_H
的main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QFileSystemModel>
#include<QStringList>
#include <QTreeView>
#include <QGraphicsScene>
#include <QTime>
#include <QDebug>
#include <iostream>
#include <QTimer>
#include <QSwipeGesture>
#include <QGestureEvent>
#include <QEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
filenames.append("/mnt/m_internal_storage/test/apple.jpg");
filenames.append("/mnt/m_internal_storage/test/grape.jpg");
filenames.append("/mnt/m_internal_storage/test/lemon.jpg");
showpic = NULL;
m_timer.setInterval(1000);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
grabGesture(Qt::SwipeGesture);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::event(QEvent *event)
{
if (event->type() == QEvent::Gesture)
return gestureEvent(static_cast<QGestureEvent*>(event));
return QWidget::event(event);
}
void MainWindow::swipeTriggered(QSwipeGesture *gesture)
{
if (gesture->state() == Qt::GestureFinished) {
if (gesture->horizontalDirection() == QSwipeGesture::Right){
if(showpic != NULL){
showpic->show();
}
}
}
}
bool MainWindow::gestureEvent(QGestureEvent *event)
{
if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
swipeTriggered(static_cast<QSwipeGesture *>(swipe));
return true;
}
void MainWindow::tick(){
showpic->addPixmap(*m_imageIt);
m_imageIt ++;
if(m_imageIt == filenames.end()){
m_timer.stop();
m_imageIt = filenames.begin();
}
}
void MainWindow::on_pushButton_2_clicked() //play button
{
m_imageIt = filenames.begin();
if(!filenames.isEmpty() && showpic == NULL){
showpic = new ShowPic();
}
if(!filenames.isEmpty() && !showpic->isVisible()){ // initial click
showpic->setWindowState(Qt::WindowMaximized);
showpic->show();
}
if(!filenames.isEmpty())
m_timer.start();
}
void MainWindow::on_pushButton_3_clicked() //stop button
{
m_timer.stop();
}
showpic.cpp
#include "showpic.h"
#include "ui_showpic.h"
#include <QGestureEvent>
ShowPic::ShowPic(QWidget *parent) :
QWidget(parent),
ui(new Ui::ShowPic)
{
ui->setupUi(this);
ui->graphicsView->setScene(new QGraphicsScene);
ui->horizontalLayout->addWidget(ui->graphicsView);
this->setLayout(ui->horizontalLayout);
grabGesture(Qt::SwipeGesture);
}
ShowPic::~ShowPic()
{
delete ui;
}
bool ShowPic::event(QEvent *event)
{
if (event->type() == QEvent::Gesture)
return gestureEvent(static_cast<QGestureEvent*>(event));
return QWidget::event(event);
}
void ShowPic::swipeTriggered(QSwipeGesture *gesture)
{
if (gesture->state() == Qt::GestureFinished) {
if (gesture->horizontalDirection() == QSwipeGesture::Left)
this->hide();
}
}
bool ShowPic::gestureEvent(QGestureEvent *event)
{
if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
swipeTriggered(static_cast<QSwipeGesture *>(swipe));
return true;
}
void ShowPic::addPixmap(const QPixmap &pixmap){
ui->graphicsView->setScene(new QGraphicsScene);
ui->graphicsView->scene()->addPixmap(pixmap);
ui->graphicsView->fitInView(ui->graphicsView->scene()->itemsBoundingRect() ,Qt::KeepAspectRatio);
}
此外,有人告诉我,程序的某些部分导致内存泄漏问题,发生在ui->graphicsView->setScene(new QGraphicsScene);
,但如果我在添加像素图之前将其设为ui->graphicsView->scene()->clear();
,则图像场景将不断变大添加图像时目前,我不知道如何解决这个内存泄漏问题。