2015-01-03 5 views
1

У меня есть два похожих кода с небольшой разницей. В первом коде я воспроизвожу видео напрямую, вызывая функцию play() в конструкторе, а во втором коде я вызываю функцию воспроизведения в событии нажатия кнопки.ASSERT: «m_surface» при воспроизведении видео

Второй код воспроизводит видео правильно, но первый код показывает мне это во время выполнения ошибки:

error

Что проблема в первом коде?

Это мой первый код:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QFileDialog> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    scene = new QGraphicsScene; 
    ui->graphicsView->setScene(scene); 
    mp1.setVideoOutput(&v1); 
    QString foo("C:/Users/user/Desktop/files/1.mov"); 
    play(QUrl(foo)); 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
void MainWindow::play(QUrl url) 
{ 
    mp1.setMedia(url); 
    mp1.play(); 
    mp1.setVolume(0); 
    scene->addItem(&v1); 
} 

Это мой второй код:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QFileDialog> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    scene = new QGraphicsScene; 
    ui->graphicsView->setScene(scene); 
    mp1.setVideoOutput(&v1); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
void MainWindow::play(QUrl url) 
{ 
    mp1.setMedia(url); 
    mp1.play(); 
    mp1.setVolume(0); 
    scene->addItem(&v1); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), 
                ""); 
    play(fileName); 

} 

подробнее: - ОС: Windows 7 64 бит - составитель: mscv2013 64 бит - mp1: QMediaPlayer - v1: QGraphicsVideoItem

ответ

0

Поскольку вы звоните play из в конструкторе кажется, что некоторые вещи еще не полностью инициализировались, что вызывает неудавшееся утверждение.

Чтобы проверить это, попробуйте добавить следующую функцию в MainWindow в разделе slots::

void MainWindow::playVideo() 
{ 
    QString foo("C:/Users/user/Desktop/files/1.mov"); 
    play(QUrl(foo)); 
} 

и в MainWindow конструктору необходимо выполнить следующие действия:

QTimer::singleShot(0, this, SLOT(playVideo())); 

вместо вызова play непосредственно.

+0

спасибо за ваш ответ. его работы хорошие. – user3801337

Смежные вопросы