继承 object [Qt5] 中的信号和插槽问题
Signals and Slots issue in inherited object [Qt5]
我创建了一个 MySoundEffect class,因为我想通过使其能够 return 播放开始后经过的时间来增强它的 isPlaying() 功能。所以我做了你在代码中看到的。
问题是,构造函数中的连接抛出错误。它就像我连接到 parent 的 asetTimer() 插槽一样,当然它不存在。我在运行时用调试器检查了这个指针,它指向一个 MySoundEffect object。
我做错了什么?
.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
添加Q_OBJECT宏:
class MySoundEffect : public QSoundEffect
{
Q_OBJECT
//...
和运行 qmake。没有这个宏 moc(元对象编译器)无法找到您的 class 并且无法创建插槽和信号,因此编译器会向您显示没有这样的插槽的错误。
更多信息:http://qt-project.org/doc/qt-4.8/metaobjects.html
你也写到你用的是Qt5,知道有新的语法就好了
http://qt-project.org/wiki/New_Signal_Slot_Syntax
这允许您以更多信息的方式捕获许多错误(例如丢失的宏或不同类型)并在编译时执行此操作。
您忘记了构造函数前的魔法关键字Q_OBJECT。
没有它,signal/slot 机制将无法工作。
我创建了一个 MySoundEffect class,因为我想通过使其能够 return 播放开始后经过的时间来增强它的 isPlaying() 功能。所以我做了你在代码中看到的。
问题是,构造函数中的连接抛出错误。它就像我连接到 parent 的 asetTimer() 插槽一样,当然它不存在。我在运行时用调试器检查了这个指针,它指向一个 MySoundEffect object。
我做错了什么?
.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
添加Q_OBJECT宏:
class MySoundEffect : public QSoundEffect
{
Q_OBJECT
//...
和运行 qmake。没有这个宏 moc(元对象编译器)无法找到您的 class 并且无法创建插槽和信号,因此编译器会向您显示没有这样的插槽的错误。
更多信息:http://qt-project.org/doc/qt-4.8/metaobjects.html
你也写到你用的是Qt5,知道有新的语法就好了
http://qt-project.org/wiki/New_Signal_Slot_Syntax
这允许您以更多信息的方式捕获许多错误(例如丢失的宏或不同类型)并在编译时执行此操作。
您忘记了构造函数前的魔法关键字Q_OBJECT。 没有它,signal/slot 机制将无法工作。