C ++访问对象,QT

时间:2015-11-05 18:08:12

标签: c++ qt leap-motion

当有人能帮助我的时候,我会很感激。我不习惯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

提前致谢!

3 个答案:

答案 0 :(得分:2)

您需要做的就是

leapMotionListener.setPlayer(*player);

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

答案 1 :(得分:0)

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

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

QMediaPlayer player;

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

void setPlayer(QMediaPlayer* mplayer);

如果您更新了功能签名,那么您还需要修复其他功能签名,并在引用播放器时将&符号从connect()语句中删除。

答案 2 :(得分: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;
}