我有这样的代码示例
#include <QAbstractItemModel>
QAbstractItemModel* pSomeModel;
class A : public QObject
{
public:
A(){
connect(pSomeModel, &QAbstractItemModel::dataChanged, this, &A::foo);
}
protected slots:
virtual void foo(){};
};
class B : public A
{
public:
B(){}
void disconnectFoo() // calls for some extra reasons, when i do not need to accept model signals
{
disconnect(pSomeModel, &QAbstractItemModel::dataChanged, this, &A::foo); // cannot access protected member error
};
protected slots:
void foo() override {};
};
我已经阅读了有关此问题的一些信息,并了解到我只能访问 B 内的受保护成员 B::foo 。所以我尝试过
disconnect(pSomeModel, &QAbstractItemModel::dataChanged, this, &B::foo);
,但当然它无法正常工作,因为它仍然调用 A::foo 插槽来获取模型信号。
我可以断开(model,signal,A,nullptr)然后连接(model,signal,B,foo),它工作正常,但看起来很难看。它仅适用于只有一个虚拟插槽的情况,但如果我需要一些插槽并且不需要断开它们,该怎么办?那么如何正确断开此类虚拟插槽呢?
该代码与 Qt 的范例相矛盾。类定义中没有 Q_OBJECT 宏是主要宏。
无父对象和指向(或不?)某个对象的全局变量是另一个。 Qt 不会删除孤儿,你应该小心并对其使用
deleteLater()
方法。
您无法连接其他类的非公共插槽,这是设计使然。他们必须是公开的或者必须能够访问他们的地址。
外部连接过程实际上是一个常见的实例,它起到了一种解耦机制的作用:这样类之间就没有循环依赖。从父对象内部连接到子对象是另一回事。
例如模特可以是这两个孩子的父母,他们与她联系并对她做了其他不可提及的事情。