Буду признателен, когда кто-нибудь сможет мне помочь. Я не привык к C ++. Я новичок в этом.
Моя проблема: я хочу сделать объект «игрок» пригодным для использования другим классом. Я не понимаю, как архивировать это.
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.h
#include <QMainWindow>
#include <QMediaPlayer>
#include <QDebug>
#include "Leap.h"#include <leapmotionlistener.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QMediaPlayer* player;
private slots:
....
private:
Ui::MainWindow *ui;
void initialize();
Controller controller;
LeapMotionListener leapMotionListener;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QSound>
#include <iostream>
#include <QfileDialog>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
connect(player, &QMediaPlayer::positionChanged, this, &MainWindow::on_positionChanged);
connect(player, &QMediaPlayer::durationChanged, this, &MainWindow::on_durationChanged);
initialize();
}
QString path;
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initialize(){
controller.addListener(leapMotionListener);
leapMotionListener.setPlayer(player);
controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);
}
...
leapmotionlistener.h
#ifndef LEAPMOTIONLISTENER
#define LEAPMOTIONLISTENER
#include <iostream>
#include <cstring>
#include "Leap.h"#include <QFile>
#include <QAudioOutput>
#include <QMediaPlayer>
using namespace Leap;
class LeapMotionListener : public Listener {
public:
LeapMotionListener();
void setPlayer(QMediaPlayer&);
//... some more methods
private:
QMediaPlayer player;
};
#endif // LEAPMOTIONLISTENER
leapmotionlistener.cpp
//calls the player object in one method like the following
player.stop();
Мои основные вопросы: что я делаю неправильно, когда ссылаюсь и инстанцирую? И как leapmotionlistener может получить доступ к одному и тому же объекту плеера (я хочу повлиять на звук)?
Я получаю ошибку:
MusicPlayer\mainwindow.cpp:32: Error: C2664: 'void LeapMotionListener::setPlayer(QMediaPlayer &)' : converting from argument 1 'QMediaPlayer *' in 'QMediaPlayer &' not possible
Этот небольшой проект можно скачать для быстрого просмотра по следующей ссылке:
https://www.dropbox.com/s/igr7ywnvicdlxxd/MusicPlayer.zip?dl=0
Заранее спасибо!
Все, что вам нужно сделать, это
leapMotionListener.setPlayer(*player);
Ссылка lvalue связывается с объектом, а не с указателем на объект. Чтобы получить объект от указателя на него, необходимо разыменовать указатель, используя *
,
Среди других проблем, QMediaPlayer, который вы пытаетесь передать setPlayer, является указателем, а не ссылкой на объект.
Вы можете создать экземпляр объекта своего игрока следующим образом:
QMediaPlayer player;
Или вы можете изменить подпись функции setPlayer на это:
void setPlayer(QMediaPlayer* mplayer);
Если вы обновите сигнатуру своей функции, вам также потребуется исправить сигнатуры других функций и не указывать амперсанды в своих операторах connect () при обращении к игроку.
следующие работали сейчас:
в MainWindow.h:
public:
QMediaPlayer* player;
в MainWindow.cpp:
player = new QMediaPlayer(this);
leapMotionListener.setPlayer(player);
controller.addListener(leapMotionListener);
в LeapMotionListener.h:
private:
QMediaPlayer *player;
public:
void setPlayer(QMediaPlayer *mplayer);
в LeapMotionListener.cpp:
LeapMotionListener::LeapMotionListener()
: player(0)
{}void LeapMotionListener::setPlayer(QMediaPlayer *mplayer){
player = mplayer;
}