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