QMediaPlayer应用程序在短时间内多次播放时无响应

时间:2015-09-10 07:20:23

标签: c++ qt qmediaplayer

我创建了一个默认的Qt GUI应用程序,我在主窗口类中添加了void keyPressEvent(QKeyEvent* ev);,当用户按下空格时,应用程序将播放声音(确定),但是当用户在短时间内按下多次时,该应用程序将不会响应。我不知道为什么?请帮帮我!

.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 个答案:

答案 0 :(得分: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替换布尔值以指示最后加载的媒体。