我创建了一个基类,为它的所有子类提供一个公共信号:
#include <QWidget>
namespace Dino {
/**
* @brief Base class for all single-value settings editors
*
* Provides a valueChanged() signal that can be used to propagate changes to
* values up to the MainWindow
*/
class TypeEditor : public QWidget
{
Q_OBJECT
public:
explicit TypeEditor(QWidget *parent = 0):QWidget(parent){}
signals:
void valueChanged();
};
} // namespace Dino
在一个子类中,我想让这个信号可用,但也定义一个更具体的信号,名称相同但参数不同:
#include "ui/typeeditor.h"
namespace Dino {
class BoolEditor : public TypeEditor
{
Q_OBJECT
public:
explicit BoolEditor(QWidget* parent = 0):TypeEditor(parent){}
signals:
void valueChanged(bool value);
public slots:
void setValue(bool value)
{
emit valueChanged(value);
emit valueChanged();
}
};
} // namespace Dino
这个想法是,当只知道基类类型时,可以使用广义信号,这表明值发生了变化。当确切的子类类型已知时,另一个信号可用,它告诉新值。
现在,当我尝试编译时,我收到一条错误消息,emit valueChanged()
指出没有调用函数Dino::BoolEditor::valueChanged()
。
当我将基类中的信号重命名为其他名称时,它可以工作,所以这似乎是信号重载的问题。我会对这样做的原因感兴趣。是我不知道的一些设计要求阻止我在子类中重载信号,还是我只是在代码中遗漏了一些东西?