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;
}
如果有人能帮助我,我将不胜感激。我不习惯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;
}