Qt:虚拟插槽断开连接

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

我有这样的代码示例

#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),它工作正常,但看起来很难看。它仅适用于只有一个虚拟插槽的情况,但如果我需要一些插槽并且不需要断开它们,该怎么办?那么如何正确断开此类虚拟插槽呢?

c++ qt signals slots
1个回答
0
投票

该代码与 Qt 的范例相矛盾。类定义中没有 Q_OBJECT 宏是主要宏。

无父对象和指向(或不?)某个对象的全局变量是另一个。 Qt 不会删除孤儿,你应该小心并对其使用

deleteLater()
方法。

您无法连接其他类的非公共插槽,这是设计使然。他们必须是公开的或者必须能够访问他们的地址。

外部连接过程实际上是一个常见的实例,它起到了一种解耦机制的作用:这样类之间就没有循环依赖。从父对象内部连接到子对象是另一回事。

例如模特可以是这两个孩子的父母,他们与她联系并对她做了其他不可提及的事情。

© www.soinside.com 2019 - 2024. All rights reserved.