信号-槽是非常优秀的通信机制,但Qt的moc实现方式,被一些人诟病,所以他们造了新的轮子, 仿造Qt,但是without moc:
Verdigris:
copperspice
Differences between CopperSpice and Verdigris
| Pure Qt | Verdigris | CopperSpice | |
|---|---|---|---|
| Requires moc | Yes | No | No |
| Usage | Convenient macros | Ugly macros | Ugly macros |
| Qt Compatibility | Obviously | Yes | No |
| MetaObject generation | Compile Time (By moc) | Compile Time (By the compiler) | Run-time (At load time) |
| MetaObject location | Shared read-only memory | Shared read-only memory | Heap |
Macros
| Qt | Verdigris | CopperSpice |
|---|---|---|
Q_OBJECT | W_OBJECT(MyClass) ... W_OBJECT_IMPL(MyClass) | CS_OBJECT(MyClass) |
public slots: void mySlot(int x); | void mySlot(int x); W_SLOT(mySlot) | CS_SLOT_1(Public, void mySlot(int x)) CS_SLOT_2(mySlot) |
signals: void mySignal(int x); | void mySignal(int x) W_SIGNAL(mySignal,x) | CS_SIGNAL_1(Public, void mySignal(int x)) CS_SIGNAL_2(mySignal,x) |
Q_PROPERTY(int myProperty WRITE setProp READ getProp NOTIFY propChanged) | W_PROPERTY(int, myProperty WRITE setProp READ getProp NOTIFY propChanged) | CS_PROPERTY_READ(myProperty, getProp) CS_PROPERTY_WRITE(myProperty, setProp) CS_PROPERTY_NOTIFY(myProperty, propertyChanged) |
private slots: myPrivateSlot(int x); | void myPrivateSlot(int x); W_SLOT(myPrivateSlot, (int), W_Access::Private) | CS_SLOT_1(Private, void myPrivateSlot(int x)) CS_SLOT_OVERLOAD(myPrivateSlot,(int)) |
其他第三方信号槽
gitee.com/giveda/gobj… 类似Qt的信号槽,但不需要moc;基于c++11,用于解耦合;【推荐】
property_bindings