如何在QT中为Android

时间:2018-01-09 03:11:34

标签: android qt

我正在尝试使用幻灯片放映创建图像查看器应用。当用户点击播放按钮时,观看者开始在另一个窗口中显示带有幻灯片放映的图像。当用户点击停止按钮时,查看器停止显示图像。这部分成功完成。

但其余部分未成功完成。我想当用户在幻灯片放映屏幕上向左滑动时,它将返回到主页面屏幕,当用户在主页面屏幕上向右滑动时,它将返回到幻灯片放映屏幕。但是我的代码无法执行此类操作。屏幕只用一根手指没有响应,但用三根手指工作。我只知道Qt :: SwipeGesture作为QGestureRecognizer的一部分用三个手指而不是一个手指注册。请帮帮我。

主页面屏幕

Main screen

幻灯片放映屏幕

slide show screen

代码:

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();,则图像场景将不断变大添加图像时目前,我不知道如何解决这个内存泄漏问题。

0 个答案:

没有答案