2015-09-10 5 views
0

Я создал приложение Qt GUI по умолчанию, я добавил void keyPressEvent(QKeyEvent* ev); в классе mainwindow, когда пользователь нажимает пробел, приложение будет воспроизводить звук (ok), но когда пользователь нажмите много раз за короткое время, приложение не ответит. Я не знаю почему? Помоги мне, пожалуйста!Приложение QMediaPlayer не отвечает при воспроизведении много раз за короткое время

.pro файл:

QT  += core gui multimedia 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = untitled2 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

FORMS += mainwindow.ui 

RESOURCES += \ 
    res.qrc 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QMediaPlayer> 

namespace Ui { class MainWindow; } 

class MainWindow : public QMainWindow { 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void keyPressEvent(QKeyEvent* ev); 
private: 
    Ui::MainWindow *ui; 
    QMediaPlayer mp; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ ui->setupUi(this); } 

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

void MainWindow::keyPressEvent(QKeyEvent* ev) { 
    switch(ev->key()) { 
    case Qt::Key_Space: { 
    mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav")); 
    mp.play(); 
    break; 
    } 
    } 
} 

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.ui. res.qrc здесь)

ответ

1

mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));

Не устанавливайте носитель без необходимости, так как медиаплеер оленьей кожи проверить внутренне «О СМИ это же я собираюсь быть умными»

Скорее вы хотите для запуска носителя с самого начала, когда его клавиша снова нажата. Простейшим решением является наличие булеана, указывающего, установлен ли носитель.

case Qt::Key_Space: 
    { 
    if(!is_media_set) 
    { 
     mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav")); 
     is_media_set = true; 
    } 
    mp.setPosition(0); 
    mp.play(); 
    break; 
    } 

Если несколько клавиш вызвать различные звуки заменить булевы с current_media_key, чтобы указать последние СМИ загружены.

+0

ответ mp.setPosition (0); – aviit

1

Для setMedia, документация говорит:

Установка этого свойства в нуль QMediaContent заставит игрока отбрасывание всю информацию, относящуюся к текущему медиа-источника и прекратить все операции ввода/вывода, связанные с это носитель информации.

Каждый раз, когда один нажимает пространство снова, медиа-файл должен быть загружен с диска, это может быть хорошая идея, чтобы загрузить его один раз в конструкторе или методе инициализации, чтобы сохранить время загрузки (доступ к жесткий диск всегда медленный)

Чтобы снова запустить звук, добавьте также setPosition(0), прежде чем звонить play().

+0

, если setMedia в конструкторе или где-то там, звук будет воспроизводиться только один раз. Я не знаю почему. – aviit

+0

Сохраняется ли проблема, если вы вызываете «setPosition (0)» перед «play()»? – Gombat

+0

Настройка setMedia во много раз вызовет не реагирование. -> установить только один раз – aviit

0

Я не уверен, что это лучший ответ, но это мой окончательный результат:

void MainWindow::keyPressEvent(QKeyEvent* ev) { 
    switch(ev->key()) { 
    case Qt::Key_Space: { 
    qDebug() << mp.mediaStatus() << mp.state(); 
    if(mp.state() == QMediaPlayer::StoppedState) { 
     mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav")); 
    } 
    mp.setPosition(0); 
    mp.play(); 
    break; 
    } 
    } 
}