KcF*_*nMi 1 c++ qt c++11 qt5 c++14
比方说,SomeClass有成员Object1和Object2与之间有一个连接Object1和Object2这样的:
connect(Object1, signal1, Object2, slot1)
Run Code Online (Sandbox Code Playgroud)
经过一番重构Object3加入SomeClass和Object2被转移到成为其成员Object3,但仍存在之间的连接的需求Object1和Object2.
现在Object1和之间的沟通Object2必须经历Object3.这意味着Object3需要修改,添加一对信号/插槽只是为了实现Object1和之间的通信Object2.
这意味着Object3将修改.h和.cpp,添加许多代码行来完成之前在一行中完成的操作.
我懒惰的一面是说这个故事有些奇怪.有没有办法让这种联系更直接?
你封装Object2在里面Object3.从图中的点用户的Object3,没有什么改变:还是有代码来建立连接只有一行.Object3需要一个额外的插槽,转发到Object2它现在封装的实例.这是一条额外的线.就是这样.
struct Object1 : QObject {
Q_SIGNAL void signal1();
Q_OBJECT
};
struct Object2 : QObject {
Q_SLOT void slot1() {}
Q_OBJECT
};
class Object3 : QObject {
Q_OBJECT
Object2 m_object2;
public:
// one line to expose object2's slot
Q_SLOT void slot1() { m_object2.slot1(); }
};
class SomeClass {
Object1 m_object1;
Object3 m_object2;
public:
SomeClass() {
// still one line
connect(&m_object1, &Object1::signal1, &m_object3, &Object3::slot1);
}
};
Run Code Online (Sandbox Code Playgroud)