覆盖子类中的 Qt 插槽
Override Qt slot in subclass
我有一个基class,它定义了一个Qt槽
class Base
{
public:
Base()
{
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot()
{}
}
Subclass A 只是实现了一些其他的东西。 Subclass B 覆盖 slot
class SubB : Base
{
public:
SubB() : Base()
{
// Necessary?
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot() override
{}
}
插槽的覆盖是否也替换了之前在 Bass 构造函数中完成的连接(即 SubB 中的连接是不必要的)?
您不需要在子类构造函数中放置相同的 connect
。创建 SubB
对象时,Base
构造函数中的 connect
将连接正确的插槽(在 SubB 中被覆盖的插槽)。
它变得更好了:您不需要对派生 class 中的插槽进行任何特殊处理。没有必要让它成为虚拟的(它已经是每个 C++ 语义),也没有必要再次让它成为一个插槽(它已经是每个 Qt 语义)。在 Derived
中添加第二个连接是不正确的,它只会导致每次激活信号时插槽被激活两次。
请记住,信号和槽是常规的 C++ 方法,并且槽是从机器生成的代码中调用的,这些代码看起来就像您在调用槽时没有指定特定的 class 它应该在其中一样。因此考虑到 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 { ... }
};
我有一个基class,它定义了一个Qt槽
class Base
{
public:
Base()
{
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot()
{}
}
Subclass A 只是实现了一些其他的东西。 Subclass B 覆盖 slot
class SubB : Base
{
public:
SubB() : Base()
{
// Necessary?
connect(otherobject, SIGNAL(mySignal), this, SLOT(mySlot));
}
public slots:
virtual void mySlot() override
{}
}
插槽的覆盖是否也替换了之前在 Bass 构造函数中完成的连接(即 SubB 中的连接是不必要的)?
您不需要在子类构造函数中放置相同的 connect
。创建 SubB
对象时,Base
构造函数中的 connect
将连接正确的插槽(在 SubB 中被覆盖的插槽)。
它变得更好了:您不需要对派生 class 中的插槽进行任何特殊处理。没有必要让它成为虚拟的(它已经是每个 C++ 语义),也没有必要再次让它成为一个插槽(它已经是每个 Qt 语义)。在 Derived
中添加第二个连接是不正确的,它只会导致每次激活信号时插槽被激活两次。
请记住,信号和槽是常规的 C++ 方法,并且槽是从机器生成的代码中调用的,这些代码看起来就像您在调用槽时没有指定特定的 class 它应该在其中一样。因此考虑到 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 { ... }
};