QSound错误 - 参考?

时间:2013-02-25 18:55:58

标签: c++ qt

我正在尝试从QSound对象播放声音。我看不出为什么它不起作用,看看前面的例子

这是标题

#ifndef ACCESSPANEL_H
#define ACCESSPANEL_H

#include <QWidget>
#include "theislandmain.h"
#include <QString>
#include <QtMultimedia/QSound>

namespace Ui {
    class accessPanel;
}

class accessPanel : public QWidget
{
    Q_OBJECT

public:
    explicit accessPanel(QWidget *parent = 0);
    ~accessPanel();


private slots:

    QString getCode();

    void on_one_clicked();

    void on_two_clicked();

    void on_three_clicked();

    void on_four_clicked();

    void on_five_clicked();

    void on_six_clicked();

    void on_seven_clicked();

    void on_eight_clicked();

    void on_nine_clicked();

    void on_cancel_clicked();

    void on_zero_clicked();

    void on_confirm_clicked();

private:
    Ui::accessPanel *ui;
    QString input;
    QSound *keypad;
};

#endif // ACCESSPANEL_H

这是主要的

#include "accesspanel.h"
#include "ui_accesspanel.h"
#include <QtMultimedia/QSound>


accessPanel::accessPanel(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::accessPanel)
{
    ui->setupUi(this);
    keypad = new QSound("../Island/Sounds/keypad.wav", this);
}

accessPanel::~accessPanel()
{
    delete ui;
}

QString accessPanel::getCode()
{
    return input;
}

void accessPanel::on_one_clicked()
{
    keypad->play();
    input = input + "1";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_two_clicked()
{
    input = input + "2";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_three_clicked()
{
    input = input + "3";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_four_clicked()
{
    input = input + "4";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_five_clicked()
{
    input = input + "5";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_six_clicked()
{
    input = input + "6";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_seven_clicked()
{
    input = input + "7";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_eight_clicked()
{
    input = input + "8";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_nine_clicked()
{
    input = input + "9";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_cancel_clicked()
{
    this->close();
    input = "";
    ui->codeDisplay->clear();
}

void accessPanel::on_zero_clicked()
{
    input = input + "0";
    ui->codeDisplay->setText(input);
}

void accessPanel::on_confirm_clicked()
{
    ui->codeDisplay->setText(input);
    TheIslandMain::setInput(input);
    this->close();
}

我收到以下错误。

  

accesspanel.obj:-1:错误:LNK2019:未解析的外部符号   “__declspec(dllimport)public:void _ thiscall QSound :: play(void)”   ( _imp_?play @ QSound @@ QAEXXZ)在函数“private:void”中引用   __thiscall accessPanel :: on_one_clicked(void)“(?on_one_clicked @ accessPanel @@ AAEXXZ)

     

accesspanel.obj:-1:错误:LNK2019:未解析的外部符号   “__declspec(dllimport)public:__ thiscall QSound :: QSound(class QString)   const&amp;,类QObject *)“   (_ imp ?? 0QSound @@ QAE @ ABVQString @@ PAVQObject @@@ Z)在   function“public:__ thiscall accessPanel :: accessPanel(class QWidget   *)“(?? 0accessPanel @@ QAE @ PAVQWidget @@@ Z)

     

accesspanel.obj:-1:错误:LNK2001:未解析的外部符号   “public:virtual struct QMetaObject const * __thiscall   QSound :: metaObject(void)const“   (?元对象@ @@的QSound @@ UBEPBUQMetaObject XZ)

另外3人与之相似。

我尝试了以下

QSound::play("filename"); - 同样的问题

我用静态引用搞砸了但是得到了类似

的东西

3 个答案:

答案 0 :(得分:2)

问题是我的.pro文件。我需要将QT + =多媒体添加到我的项目.pro文件中。

答案 1 :(得分:0)

我遇到了同样的问题。我没有创建指针,而是在标题中创建一个空变量:

private:
      QSound m_startsound; 

我通过明确提及父对象来分配值(感谢提醒我):

BloxProcessor::BloxProcessor() : 
     m_showPopup(true),
     ....
     m_startsound("mysounds/hallo.wav",this)
{
....
}

您也可以在cpp文件中执行此操作。在我的意见较少的结构化解决方案:

包括

... QSound m_startsound(“mysounds / hallo.wav”,this);

但是,这些解决方案可以解决多次播放静音的加载时间问题。它不会使声音在某个触发器上发生变化。这需要你的指针结构: 在标题中     QPointer p_startsound;

在init或构造函数中设置默认值:

p_startsound = new QSound("mysounds/he.wav",this);

on change trigger确保删除旧对象以防止内存泄漏

BloxProcessor::triggerToChangeSoundActivated()
{
    p_startsound->deleteLater();
    p_startsound = new QSound("mysounds/hallo.wav",this);
}

如果计算时间不重要,可以使用简单的播放功能

QSound::play("mysounds/hallo.wav");

顺便说一句 不知何故,我不需要为这些中的任何一个明确地包含多媒体包。也许是因为我使用了不同版本的QT,或者因为它是在平台的其他地方继承的。

编辑使用受保护的QPointer,否则会崩溃......

答案 2 :(得分:0)

如果您使用的是QT5 请在其他依赖项中添加Qt5Multimedia.lib,网址为
项目->属性->配置属性->链接器->输入->其他依赖项