C++ 访问对象,QT

C++ accessing object, QT

如果有人能帮助我,我将不胜感激。我不习惯C++。我是新手。

我的问题:我想让一个对象 "player" 可用于另一个 class。我不知道如何存档。

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

这个小项目可以通过以下 link 下载以快速查看: https://www.dropbox.com/s/igr7ywnvicdlxxd/MusicPlayer.zip?dl=0

提前致谢!

除其他问题外,您尝试传递给 setPlayer 的 QMediaPlayer 是一个指针,而不是对对象的引用。

您可以像这样实例化您的播放器对象:

QMediaPlayer player;

或者您可以将 setPlayer 函数签名更改为:

void setPlayer(QMediaPlayer* mplayer);

如果更新函数签名,您还需要修复其他函数签名,并在引用播放器时将 & 符号排除在 connect() 语句之外。

您只需

leapMotionListener.setPlayer(*player);

左值引用绑定到对象,而不是指向对象的指针。为了从指向它的指针获取对象,您需要使用 *.

取消引用指针

以下内容现在有效:

在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;
}