QMediaPlayer 应用程序在短时间内多次播放时没有响应
QMediaPlayer app not responding when play many times in a short duration
我创建了一个默认的 Qt GUI 应用程序,我在主窗口 class 中添加了 void keyPressEvent(QKeyEvent* ev);
,当用户按下 space 时,该应用程序将播放声音(正常)但是当用户在短时间内多次按下,应用程序将无响应。我不知道为什么?请帮助我!
.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这里)
mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));
不要设置不必要的媒体,因为媒体播放器不会内部检查"Oh the media is the same I am going to be clever"
相反,您想在再次按下媒体键时从头开始播放媒体。最简单的解决方案是使用一个布尔值来指示媒体是否已设置。
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
以指示最后加载的媒体。
要设置媒体,文档说:
Setting this property to a null QMediaContent will cause the player to
discard all information relating to the current media source and to
cease all I/O operations related to that media.
每按一次space,媒体文件必须从磁盘加载,最好在构造函数或初始化方法中加载一次,以节省加载时间(访问硬盘总是很慢)
要再次运行声音,在调用play()
之前还要添加setPosition(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;
}
}
}
我创建了一个默认的 Qt GUI 应用程序,我在主窗口 class 中添加了 void keyPressEvent(QKeyEvent* ev);
,当用户按下 space 时,该应用程序将播放声音(正常)但是当用户在短时间内多次按下,应用程序将无响应。我不知道为什么?请帮助我!
.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这里)
mp.setMedia(QUrl("qrc:/sounds/Fireworks.wav"));
不要设置不必要的媒体,因为媒体播放器不会内部检查"Oh the media is the same I am going to be clever"
相反,您想在再次按下媒体键时从头开始播放媒体。最简单的解决方案是使用一个布尔值来指示媒体是否已设置。
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
以指示最后加载的媒体。
要设置媒体,文档说:
Setting this property to a null QMediaContent will cause the player to discard all information relating to the current media source and to cease all I/O operations related to that media.
每按一次space,媒体文件必须从磁盘加载,最好在构造函数或初始化方法中加载一次,以节省加载时间(访问硬盘总是很慢)
要再次运行声音,在调用play()
之前还要添加setPosition(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;
}
}
}