覆盖子类中的Qt槽

Override Qt slot in subclass

本文关键字:Qt 子类 覆盖      更新时间:2023-10-16

我有一个基类,它定义了一个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语义)。在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 { ... }
};

您不需要在子类构造函数中放入相同的connect。创建SubB对象时,Base构造函数中的connect将连接右侧插槽(在SubB中重写的插槽)。