覆盖子类中的Qt槽
Override Qt slot in subclass
我有一个基类,它定义了一个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中重写的插槽)。
相关文章:
- C++ QList 中项目的 QT 强制转换到子类
- 一个人如何将QT(C )UI分为多个小部件子类,并使其显示与同一类中的所有窗口
- 如何在Qt中处理子类中的动态内存分配
- QT子类UI表单显示一个空白窗口
- Qt c++ 类 + 子类使用 Q_OBJECT 不起作用
- QT QException子类投掷,但QunhandledException抓住了
- QT设计器中的小部件子类
- 在Qt中获取超类中的子类的名称
- 覆盖子类中的Qt槽
- 删除已创建的Qt元素和子类
- 为什么Qt提供了一个类来对其进行子类化
- Qt:当你没有对QThread进行子类化时,如何清理它
- 如何在Qt中进行子类化
- Qt子类化的图形场景不允许我选择/聚焦到它上面的图形项目
- 如何在qt c++中的子类中重载超类方法
- Qt-减少两个QAbstractListModel子类之间的重复
- 将子类与Qt一起使用
- Qt/C++重写函数而不进行子类化
- Qt:继承的信号不能在子类中识别
- Qt Creator表单的适当子类化