如何使用QTimer查看图像序列?

时间:2017-12-19 03:50:53

标签: qt

在程序中,我正在尝试使用QT创建一个图像播放器。当我单击UI中的按钮时,程序将创建一个暂停2秒的图像幻灯片。我试图将QTimer用于此类事情,但未能这样做。因此,我想问一下如何使用QTimer实现我的目的。

让我描述一下我的程序流程。当用户单击主窗口中的按钮时,将打开子窗口showpic,然后在qgraphsview中开始显示每个图像暂停2秒。图像文件路径存储在“QStringlist文件名”中。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileSystemModel>
#include "showpic.h"
#include <QBasicTimer>
#include <QTimer>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void display(const QString & , ShowPic* );


private slots:
    void tick();

    void on_pushButton_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>

namespace Ui {
class ShowPic;
}

class ShowPic : public QWidget
{
    Q_OBJECT

public:
    explicit ShowPic(QWidget *parent = 0);
    ~ShowPic();

private:
    Ui::ShowPic *ui;    

public:
    void addPixmap(const QPixmap &pixmap);
};



#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 <QThread>
#include <QDebug>
#include <iostream>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    filenames.append("C:\\test\\image.jpg");
    filenames.append("C:\\test\\apple.jpg");
    filenames.append("C:\\test\\orange.jpg");
    filenames.append("C:\\test\\lemon.jpg");
    filenames.append("C:\\test\\grape.jpg");
    m_imageIt = filenames.begin();

    m_timer.setInterval(5000);
    connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::display(const QString & filename, ShowPic* showpic) {
    showpic->addPixmap(filename);
}

void MainWindow::tick(){
    showpic = new ShowPic();
    showpic->show();
    display(*m_imageIt, showpic);
    m_imageIt ++;
}

/*
void timerEvent(QTimerEvent * ev) {
        if (ev->timerId() == m_timer.timerId()) tick();
}*/

void MainWindow::on_pushButton_clicked()
{
    /*showpic = new ShowPic();
    QPixmap pixmap("C:\\test\\image.jpg");
    showpic->addPixmap(pixmap);
    showpic->show();*/

    m_timer.start();
}

showpic.cpp

#include "showpic.h"
#include "ui_showpic.h"
#include <QThread>

ShowPic::ShowPic(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ShowPic)
{
    ui->setupUi(this);
    ui->graphicsView->setScene(new QGraphicsScene);
}

ShowPic::~ShowPic()
{
    delete ui;
}

void ShowPic::addPixmap(const QPixmap &pixmap){
    ui->graphicsView->scene()->addPixmap(pixmap);
}

编译邮件错误:

enter image description here

1 个答案:

答案 0 :(得分:1)

该错误与计时器无关,这是因为您忘记将display()tick()timerEvent()声明为MainWindow::类的一部分,因此他们无法访问MainWindow成员。

计时器应该比代码更容易使用。首先,我建议您使用QTimer代替QBasicTimer。然后,您只需连接到timeout()信号即可。

mainwindow.h

#include <QTimer>

QTimer m_timer;

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ...
    m_imageIt = filenames.begin();

    m_timer.setInterval(5000);
    connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
}

void MainWindow::on_pushButton_clicked()
{
    m_timer.start();
}

您根本不需要timerEvent()功能。