35 lines
1.4 KiB
Markdown
35 lines
1.4 KiB
Markdown
# Skill: Multi-System Signaling (uLib ↔ Qt)
|
|
|
|
This skill manages the coexistence of `uLib::Object` signals and Qt's `Q_OBJECT` signaling system.
|
|
|
|
## Context
|
|
- **uLib Signals**: Used for domain logic and data changes (`uLib::Object::connect`).
|
|
- **Qt Signals**: Used for UI events, widgets, and application-level control flow (`QObject::connect`).
|
|
|
|
## Patterns
|
|
|
|
### 1. Bridging Logic
|
|
When a domain change needs to trigger a UI update, use a wrapper or a direct connection if the widget has access to the `uLib::Object`.
|
|
```cpp
|
|
// In a Qt Widget
|
|
uLib::Object::connect(domainObj, &Object::Updated, [this]() {
|
|
this->update(); // Trigger Qt repaint
|
|
});
|
|
```
|
|
|
|
### 2. Selection Flow
|
|
Selection usually starts in the VTK Viewport (Qt) and flows to the domain context.
|
|
1. `QViewport` emits `prop3dSelected(Prop3D*)` (Qt signal).
|
|
2. `MainPanel` catches it and calls `contextPanel->selectObject(p->GetContent())`.
|
|
3. `ContextPanel` updates the tree view and property editors.
|
|
|
|
### 3. Connection Hygiene
|
|
- Use `uLib::Object::connect` for everything involving `uLib::Property` changes.
|
|
- Use Qt `connect` for button clicks, menu actions, and window events.
|
|
- Be careful with lambda captures; ensure the captured object is still alive or use weak pointers if necessary.
|
|
|
|
## Checklist
|
|
- [ ] Is the correct signaling system being used for the task?
|
|
- [ ] Are capture groups in lambdas safe?
|
|
- [ ] Does selection flow correctly between the 3D view and the tree view?
|