覆盖子类中的Qt插槽

问题描述 投票:0回答:3

我有一个基类,它定义了一个 Qt 插槽

class Base
{
public:
    Base()
    {
        connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
    }
public slots:
    virtual void mySlot()
    {}
}

子类 A 只是实现了一些其他的东西。子类 B 覆盖插槽

class SubB : Base
{
public:
    SubB() : Base() 
    {
        // Necessary?
        connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
    }
public slots:
    virtual void mySlot() override
    {}
}

插槽的覆盖是否也取代了之前在 Bass 构造函数中完成的连接(即 SubB 中的连接是不必要的)?

c++ qt inheritance
3个回答
12
投票

它变得更好:您不需要对派生类中的槽进行任何特殊处理。无需将其设为虚拟(它已经符合 C++ 语义),也无需再次将其设为插槽(它已经符合 Qt 语义)。在

Derived
中添加第二个连接是不正确的,它只会导致每次信号激活时槽被激活两次。

请记住,信号和槽是常规的 C++ 方法,并且槽是从机器生成的代码中调用的,看起来就像您调用槽而没有指定它应该位于的特定类一样。因此,虚拟槽的行为就像您认为的那样,给出 C++ 的语义。

以下内容就足够了:

class Base : public QObject
{
  Q_OBJECT
public:
  Base(QObject * src, QObject * parent = 0) : QObject(parent)
  { connect(src, SIGNAL(mySignal), SLOT(mySlot)); }
  Q_SLOT virtual void mySlot() {}
};

class Derived : public Base
{
  Q_OBJECT
public:
  Derived(QObject * src, QObject * parent = 0) : Base(src, parent) {}
  void mySlot() Q_DECL_OVERRIDE { ... }
};

11
投票

您不需要在子类构造函数中放置相同的

connect
。当创建
SubB
对象时,
connect
构造函数中的
Base
将连接右侧插槽(SubB 中覆盖的插槽)。


0
投票

我正在尝试测试之前发布的代码。

当我创建对象时,我收到以下错误消息: 没有匹配的构造函数来初始化“派生”

mDerived = new Derived;

我还看到没有构造函数,我已经尝试了各种方法,但不幸的是没有成功。不幸的是,我在 C++ 方面还没有太多经验。我会很高兴得到帮助。

class Base : public QObject
{
  Q_OBJECT
public:
  Base(QObject * src, QObject * parent = 0) : QObject(parent)
  { connect(src, SIGNAL(mySignal), SLOT(mySlot)); }
  Q_SLOT virtual void mySlot() {}
};

class Derived : public Base
{
  Q_OBJECT
public:
  Derived(QObject * src, QObject * parent = 0) : Base(src, parent) {}
  void mySlot() Q_DECL_OVERRIDE { ... }
};
© www.soinside.com 2019 - 2024. All rights reserved.