0

I created a default Qt GUI app, I added void keyPressEvent(QKeyEvent* ev); in the mainwindow class, when user presses the space, the app will plays the sound (ok) but when the user press many times in a short duration, the app will not respond. I don't know why? Help me, please!

.pro file:

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();
}

(Note: I did upload mainwindow.ui. res.qrc here)

4

3 に答える 3

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、最後にロードされたメディアを示します。

于 2015-09-10T07:47:32.990 に答える
1

メディアを設定するには、ドキュメントには次のように記載されています。

このプロパティを null QMediaContent に設定すると、プレーヤーは現在のメディア ソースに関連するすべての情報を破棄し、そのメディアに関連するすべての I/O 操作を停止します。

もう一度スペースを押すたびに、メディア ファイルをディスクからロードする必要があります。ロード時間を節約するために、コンストラクタまたは初期化メソッドで一度ロードすることをお勧めします (ハードディスクへのアクセスは常に低速です)。

setPosition(0)サウンドを再度実行するには、を呼び出す前にも追加しplay()ます。

于 2015-09-10T07:50:46.523 に答える
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;
  }
  }
}
于 2015-09-10T09:11:12.777 に答える