c++ - Qt:子类中无法识别继承的信号

标签 c++ qt inheritance signals

我创建了一个为其所有子类提供公共(public)信号的基类:

#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() 的函数.

当我将基类中的信号重命名为其他名称时它起作用了,所以这似乎是信号过载的问题。我会对这样做的原因感兴趣。是我不知道的某些设计要求阻止我在子类中重载信号,还是我只是在代码中遗漏了一些东西?

最佳答案

Signal 只是一个 protected 函数。你不能像那样重载基类函数

参见 this question了解更多详情

关于c++ - Qt:子类中无法识别继承的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16604906/

相关文章:

C++ - 二进制表达式的无效操作数

QT:字体及其宽度

c++ - mac os X 上的 qmake 子目录模板

javascript - 有没有办法子类化/继承/扩展 javascript WebSocket?

java - 继承Java super.print()不返回值

java - 使用父类(super class)的构造函数

c++ - 使用 QRegExp 忽略一行中的注释的非贪婪条件

c++ - 从 Ignite 读取 Cassandra 的 Blob

c++ - 在 clang 中循环展开

c - 在 C 中解码 printf 语句(Printf Primer)