C ++ доступ к объекту, QT

Буду признателен, когда кто-нибудь сможет мне помочь. Я не привык к 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

Заранее спасибо!

0

Решение

Все, что вам нужно сделать, это

leapMotionListener.setPlayer(*player);

Ссылка lvalue связывается с объектом, а не с указателем на объект. Чтобы получить объект от указателя на него, необходимо разыменовать указатель, используя *,

2

Другие решения

Среди других проблем, QMediaPlayer, который вы пытаетесь передать setPlayer, является указателем, а не ссылкой на объект.

Вы можете создать экземпляр объекта своего игрока следующим образом:

QMediaPlayer player;

Или вы можете изменить подпись функции setPlayer на это:

void setPlayer(QMediaPlayer* mplayer);

Если вы обновите сигнатуру своей функции, вам также потребуется исправить сигнатуры других функций и не указывать амперсанды в своих операторах connect () при обращении к игроку.

0

следующие работали сейчас:

в 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;
}
0
По вопросам рекламы [email protected]