C++ C++;-QMediaPlayer不发出声音

C++ C++;-QMediaPlayer不发出声音,c++,qt,qmediaplayer,C++,Qt,Qmediaplayer,我正在尝试使用Qt制作一个简单的synth。当您左键单击某个键时,应该会播放一个音符,但不会播放任何声音。我试图寻找解决这个问题的办法,但没有找到任何有用的办法。 由于我对Qt还比较陌生,我认为问题在于我对框架的工作原理缺乏全面的了解,但我无法理解为什么声音无法播放 我已经设法从main.cpp发出声音,并在代码中进一步包含了播放声音和不播放声音的示例 希望我已经很好地提出了我的问题,并提前表示感谢 //key.h #ifndef KEY_H #define KEY_H #include &l

我正在尝试使用Qt制作一个简单的synth。当您左键单击某个键时,应该会播放一个音符,但不会播放任何声音。我试图寻找解决这个问题的办法,但没有找到任何有用的办法。 由于我对Qt还比较陌生,我认为问题在于我对框架的工作原理缺乏全面的了解,但我无法理解为什么声音无法播放

我已经设法从main.cpp发出声音,并在代码中进一步包含了播放声音和不播放声音的示例

希望我已经很好地提出了我的问题,并提前表示感谢

//key.h
#ifndef KEY_H
#define KEY_H

#include <QGraphicsRectItem>
#include <QObject>
#include <QKeyEvent>
#include <QGraphicsSceneMouseEvent>
#include <QDebug>
#include <QBrush>
#include <QMediaPlayer>

enum Tune {A, B, C,  D, E, F,  G, ASS, BESS, DESS, ESS, GESS, MUTE}; // Key  tune

class Key : public QObject, public QGraphicsRectItem {
    Q_OBJECT
public:
    Key(Tune t=MUTE);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    void paintPlayedKey();
    void resetPaintedKey();
    void setTone();
    QMediaPlayer* getTone() {return tone;}
    Tune getTune() {return tune;}
private:
    Tune tune;
    QMediaPlayer *tone;
};

#endif // KEY_H

//key.cpp
#include "key.h"

void Key::paintPlayedKey()
{
    this->setBrush(* new QBrush(Qt::blue));
}

void Key::resetPaintedKey()
{
    if(tune < 7)
        this->setBrush(* new QBrush(Qt::white));
    else
        this->setBrush(* new QBrush(Qt::black));
}


void Key::setTone() // Sets sounds to tune
{

    if(tune == 0)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/a.wav"));
    else if (tune == 1)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/b.wav"));
    else if (tune == 2)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/c.wav"));
    else if (tune == 3)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/d.wav"));
    else if (tune == 4)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/e.wav"));
    else if (tune == 5)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/f.wav"));
    else if (tune == 6)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/g.wav"));
    else if (tune == 7)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/ab.wav"));
    else if (tune == 8)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/bb.wav"));
    else if (tune == 9)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/db.wav"));
    else if (tune == 10)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/eb.wav"));
    else if (tune == 11)
        tone->setMedia(QUrl("qrc:/keys/Pianosounds/TheKeys/gb.wav"));
}

Key::Key(Tune t)
{
    tune = t;
    tone = new QMediaPlayer();
    setTone();
}

void Key::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    //Not sure if we wanna do anything here
}

void Key::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    //play tune
    if (event->buttons() == Qt::LeftButton) {
           qDebug() << "Pressed";
           paintPlayedKey();

           if(tone->state() == QMediaPlayer::PlayingState) {
               tone->setPosition(0);
               qDebug() << "Have played?";
           }
           else if (tone->state() == QMediaPlayer::StoppedState) {
               qDebug() << "Should play?"; // Well it doesn't :-)
               tone->play();
           }
       }
}

void Key::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    //stop playing tune
    resetPaintedKey();
    tone->stop();
}


//main.cpp    
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QBrush>
#include <QMediaPlayer>
#include <QTimer>
#include <iostream>
#include <vector>

#include "mainwindow.h"
#include "key.h"

using namespace std;

const int W_KEY_H = 150; // White Key width and height
const int W_KEY_W = 50;
const double B_KEY_H = 150 * 2/3; // White Key width and height
const double B_KEY_W = 50/2;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // create a scene
    QGraphicsScene *scene = new QGraphicsScene();

    // Create white keys of synth
    Tune a = A, b = B, c = C, d = D, e = E, f = F, g = G;
    Key *a1 = new Key(a);
    Key *b1 = new Key(b);
    Key *c1 = new Key(c);
    Key *d1 = new Key(d);
    Key *e1 = new Key(e);
    Key *f1 = new Key(f);
    Key *g1 = new Key(g);

    vector<Key*> whites = {a1, b1, c1, d1, e1, f1, g1};

    int x = 0;
    for(int i = 0; i < whites.size(); i++, x+=W_KEY_W)
        whites[i]->setRect(x, 0, W_KEY_W, W_KEY_H);

    // add the keys to the scene
    for(int i = 0; i < whites.size(); i++)
        scene->addItem(whites[i]);

    // focus keys
    for(int i = 0; i < whites.size(); i++) {
        whites[i]->setFlag(QGraphicsItem::ItemIsFocusable);
        whites[i]->setFocus();
    }

    // Create black keys of synth
    Tune ass = ASS, bess = BESS, dess = DESS, ess = ESS, gess = GESS;
    Key *ass1 = new Key(ass);
    Key *bess1 = new Key(bess);
    Key *dess1 = new Key(dess);
    Key *ess1 = new Key(ess);
    Key *gess1 = new Key(gess);
    Key *ass2 = new Key(ass);

    vector<Key*> blacks = {ass1, bess1, dess1, ess1, gess1, ass2};

    // For now...
    ass1->setRect(a1->rect().x() - B_KEY_W/(double)2, 0, B_KEY_W, B_KEY_H);
    bess1->setRect(b1->rect().x() - B_KEY_W/(double)2, 0, B_KEY_W, B_KEY_H);
    dess1->setRect(d1->rect().x() - B_KEY_W/(double)2, 0, B_KEY_W, B_KEY_H);
    ess1->setRect(e1->rect().x() - B_KEY_W/(double)2, 0, B_KEY_W, B_KEY_H);
    gess1->setRect(g1->rect().x() - B_KEY_W/(double)2, 0, B_KEY_W, B_KEY_H);
    ass2->setRect(g1->rect().x() + g1->rect().width() - B_KEY_W/(double)2,     0, B_KEY_W, B_KEY_H); // Nödlösning

    //paint
    for(int i=0; i<blacks.size(); i++)
        blacks[i]->setBrush(* new QBrush(Qt::black));

    // add the keys to the scene
    for(int i = 0; i < blacks.size(); i++)
        scene->addItem(blacks[i]);

    // focus keys
    for(int i = 0; i < blacks.size(); i++) {
        blacks[i]->setFlag(QGraphicsItem::ItemIsFocusable);
        blacks[i]->setFocus();
    }

    // add a view
    QGraphicsView *view = new QGraphicsView(scene);

    //show view
    view->show();
    //view->setFixedSize(800, 600);
    //scene->setSceneRect(0, 0, 800, 600);

    // Sound plays
    QMediaPlayer *test = new QMediaPlayer();
    test->setMedia(QUrl("qrc:/sounds/Pianosounds/TheKeys/a.wav"));
    test->play();

    // doesn't play
    c1->getTone()->play();

    return app.exec();
}
//key.h
#ifndef键
#定义键
#包括
#包括
#包括
#包括
#包括
#包括
#包括
枚举调谐{A、B、C、D、E、F、G、ASS、BESS、DESS、ESS、GESS、MUTE};//调子
类密钥:公共QObject、公共QGraphicsRectItem{
Q_对象
公众:
按键(调谐t=静音);
无效鼠标压力事件(QGraphicsSceneMouseEvent*事件);
作废mouseMoveEvent(QGraphicsSceneMouseEvent*事件);
无效mouseReleaseEvent(QGraphicsSceneMouseEvent*事件);
void paintPlayedKey();
void resetPaintedKey();
void setTone();
QMediaPlayer*getTone(){return tone;}
Tune getTune(){return Tune;}
私人:
调子;
QMediaPlayer*音调;
};
#endif//KEY_H
//key.cpp
#包括“key.h”
void Key::paintPlayedKey()
{
这->挫折(*新的QBrush(Qt::蓝色));
}
void Key::resetPaintedKey()
{
如果(调谐<7)
这->挫折(*新的QBrush(Qt::白色));
其他的
这->挫折(*新的QBrush(Qt::黑色));
}
void Key::setTone()//设置要调整的声音
{
如果(调谐==0)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/a.wav”);
else if(调谐==1)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/b.wav”);
否则如果(调谐==2)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/c.wav”);
否则如果(调谐==3)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/d.wav”);
否则如果(调谐==4)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/e.wav”);
否则如果(调谐==5)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/f.wav”);
否则如果(调谐==6)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/g.wav”);
否则如果(调谐==7)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/ab.wav”);
否则如果(调谐==8)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/bb.wav”);
否则如果(调谐==9)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/db.wav”);
否则如果(调谐==10)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/eb.wav”);
否则如果(调谐==11)
音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/gb.wav”);
}
键::键(t调)
{
tune=t;
tone=新的QMediaPlayer();
setTone();
}
void键::mouseMoveEvent(qgraphicscenemouseevent*事件)
{
//不确定我们是否想在这里做点什么
}
void Key::MousePresseEvent(QGraphicsSceneMouseEvent*事件)
{
//演奏曲调
如果(事件->按钮()==Qt::LeftButton){
qDebug()状态()==QMediaPlayer::PlayingState){
音调->设置位置(0);
qDebug()状态()==QMediaPlayer::StoppedState){
qDebug()getTone()->play();
返回app.exec();
}

你应该为你的问题创建一个解决方案,以便其他人可以更容易地帮助你。音调->设置媒体(qrl(“qrc:/keys/Pianosounds/TheKeys/a.wav”);和
测试->设置媒体(qrl(“qrc:/sounds/Pianosounds/TheKeys/a.wav”))如果你认为它们是同一个资源,你会发现它没有相同的名称,验证错误不是路径修改的路径,而我没有。problems@Svaberg谢谢,我会试着用这个链接来解决将来的问题。@eyllanesc就是这么简单。谢谢你花时间