我有一个简单的课程,我会创建让我们说100个该课程的实例。
有没有办法连接所有和他的任何一个班级的插槽'对象'单个信号(反之亦然)之前创建实例(因为显然连接每个对象是一项繁琐的工作)。
提前感谢任何想法,我很高兴地欢迎任何不同的方法。
答案 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();