如何将信号连接到类的所有实例的插槽

时间:2017-07-12 13:45:56

标签: c++ qt

我有一个简单的课程,我会创建让我们说100个该课程的实例。

有没有办法连接所有和他的任何一个班级的插槽'对象'单个信号(反之亦然)之前创建实例(因为显然连接每个对象是一项繁琐的工作)。

提前感谢任何想法,我很高兴地欢迎任何不同的方法。

2 个答案:

答案 0 :(得分:2)

有一种简单的方法可以通过使用单例类来实现它,实例化类将通过它们自己连接:

Singleton类将提供单个入口点:

class Linker : public QObject
{
    Q_OBJECT

public:
        static Linker * getInstance(QObject *parent = 0)
        {
           static Linker * instance = new Linker(parent);
           return instance;
        }

        sendSignal()
        {
            emit mySignal();
        }

 signals:
        void mySignal();
};

要实例化的类:

class ClassToBeInstencied  : public QObject
{
    Q_OBJECT

private slots:
    void mySlot() {}

public:

    ClassToBeInstencied() // constructor
    {
        connect(this, &ClassToBeInstencied::mySlot, Linker::getInstance(), &Linker::mySignal);
    }
};

这样做的好处是可以保持代码干净简单,因为您不必处理类外部信号/插槽的连接,因此封装得很好。

您只需要创建一个新实例:

ClassToBeInstencied  * a = new ClassToBeInstencied();
ClassToBeInstencied  * b = new ClassToBeInstencied();
ClassToBeInstencied  * c = new ClassToBeInstencied();

,连接将自动完成。

您可以直接向所有人发送信号:

Linker::getInstance()->sendSignal();

优点:没有列表,没有任何循环,无需在类外部进行管理,也无需手动连接每个实例。

答案 1 :(得分:1)

您可以将所有实例的指针存储在构造函数中的静态列表中,并在析构函数中将其删除:

myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);
    void myMethod1();
    ~MyClass();

signals:
    void globalSignal();

public slots:

private:
    static QList<MyClass *> m_allInstances;
    void emitSignal4All();
};

#endif // MYCLASS_H

myclass.cpp

#include <QDebug>
#include "myclass.h"

QList<MyClass *> MyClass::m_allInstances;

MyClass::MyClass(QObject *parent) : QObject(parent)
{
    m_allInstances.append(this);
}

void MyClass::myMethod1()
{
    //... sample usage of `emitSignal4All()`
    emitSignal4All();
}

MyClass::~MyClass()
{
    m_allInstances.removeOne(this);
}

void MyClass::emitSignal4All()
{
    for(int i = 0; i<m_allInstances.count(); i++) {
        emit m_allInstances.at(i)->globalSignal();
    }
}

样本使用

    MyClass instance1;
    MyClass *instance2 = new MyClass();
    connect(&instance1, &MyClass::globalSignal, this, [&instance1, this]() {
        qDebug() << "signal of instance1 is fired!";
    });
    connect(instance2, &MyClass::globalSignal, this, [instance2, this]() {
        qDebug() << "signal of instance2 is fired!";
    });

    MyClass instance3;
    instance3.myMethod1();