继承对象 [Qt5] 中的信号和插槽问题



我创建了一个 MySoundEffect 类,因为我想通过使其能够返回自播放开始以来经过的时间来增强它的 isPlaying() 函数。所以我做了你在代码中看到的。

问题是,构造函数中的连接引发错误。它就像我连接到父级的 asetTimer() 插槽一样,这当然不存在。我在运行时用调试器检查了这个指针,它指向一个 MySoundEffect 对象。

我做错了什么?

.h

#ifndef MYSOUNDEFFECT_H
#define MYSOUNDEFFECT_H
#include <QSoundEffect>
#include <QElapsedTimer>
class MySoundEffect : public QSoundEffect
{
    QElapsedTimer* timer;
public slots:
    void asetTimer();
public:
    MySoundEffect();
    ~MySoundEffect();
    int isPlaying();
};
#endif // MYSOUNDEFFECT_H

。.cpp

#include "mysoundeffect.h"
MySoundEffect::MySoundEffect() : QSoundEffect()
{
    timer = new QElapsedTimer();
    connect(this,SIGNAL(playingChanged()), this, SLOT(asetTimer()));
}
void MySoundEffect::asetTimer(){
    if (QSoundEffect::isPlaying() == true){
        timer->restart();
    }
}
int MySoundEffect::isPlaying(){
    if (QSoundEffect::isPlaying() == true){
        return timer->elapsed();
    }
    else{
        return -1;
    }
}
MySoundEffect::~MySoundEffect(){
    delete timer;
}

错误:

QObject::connect: No such slot QSoundEffect::asetTimer() in ../rob3/mysoundeffect.cpp:6

你忘记了构造函数之前的 magic 关键字Q_OBJECT。没有它,信号/插槽机制将无法工作。

添加Q_OBJECT宏:

class MySoundEffect : public QSoundEffect
{
    Q_OBJECT
    //...

并运行 qmake。没有这个宏moc(元对象编译器)就找不到你的类,不能创建槽和信号,所以编译器会给你显示这个错误,没有这样的槽。

详细信息: http://qt-project.org/doc/qt-4.8/metaobjects.html

你也写过你使用 Qt5,所以很高兴知道有新的语法

http://qt-project.org/wiki/New_Signal_Slot_Syntax

这允许您以更翔实的方式捕获许多错误(例如丢失的宏或不同类型的错误)并在编译时执行此操作。

相关内容

  • 没有找到相关文章

最新更新