# vqt6 — Viper 的 Qt6 绑定包

`vqt6` 是 [Viper](https://git.gvsds.com/GVSDS/TransPyC) 语言的 **Qt6 GUI 框架绑定**，是 Viper 包管理器分发的"包"（类似于 Python 的 PyQt6、Node.js 的 node-gtk）。

> 注意：`vqt6` **不是** 包管理器，而是一个**被包管理器管理的包**（库）。
> 包管理器负责下载、预编译、安装；`vqt6` 只负责把 Qt6 C++ API 暴露给 Viper 代码。

## 架构

```
+--------------------+        +-----------------------+        +------------+
|  Viper 用户代码     |  FFI   |  vqt6 桥接层 (libvqt6) |  C++    |  Qt6 C++   |
|  (app.py)          | <----> |  - t.State 声明       | <-----> |  QtCore    |
|                    |        |  - C 桥接函数          |        |  QtGui     |
|  vqt6.QApplication |        |    (extern "C")       |        |  QtWidgets |
|  vqt6.QLabel       |        |  - 静态库 / 动态库     |        |  QtNetwork |
+--------------------+        +-----------------------+        +------------+
```

**FFI 路径**：
1. Viper 编译器把 `t.State` 声明的 `def xxx() -> t.State: pass` 解析为外部函数符号
2. 链接时通过 `libvqt6_bridge.a`（静态）或 `vqt6_bridge.dll`（动态）解析符号
3. 运行时 C 桥接层调用 Qt6 C++ API 完成实际工作

## 链接模式

| 模式 | 产物 | 优点 | 缺点 |
|------|------|------|------|
| **静态**（默认） | `libvqt6_bridge.a` | 部署简单（一个 exe），无需分发 dll | exe 体积较大 |
| **动态** | `vqt6_bridge.dll` | 共享内存，多个程序共用 | 需随 exe 分发 dll |

vqt6 同一套 C 桥接源代码，可同时编译为两种产物。Viper 项目通过 `project.vpj` 切换。

## 目录结构

```
includes/vqt6/
├── README.md           # 本文件
├── __init__.py         # 公共 Pythonic API（用户使用）
├── _types.py           # 公共类型（不透明指针 typedef）
├── _qtcore.py          # QtCore 的 t.State FFI 声明
├── _qtwidgets.py       # QtWidgets 的 t.State FFI 声明
├── _qtgui.py           # QtGui 的 t.State FFI 声明
├── _qtnetwork.py       # QtNetwork 的 t.State FFI 声明
├── _bridge.h           # C 桥接层头文件
├── _bridge.cpp         # C 桥接层实现（extern "C" 包装 Qt6 C++ API）
└── CMakeLists.txt      # 构建脚本（生成 libvqt6_bridge.a）
```

## 使用示例

```python
# App/main.py
import t
import c
import vqt6

# 1. 创建 QApplication
app: vqt6.QApplication | t.CPtr = vqt6.QApplication([])

# 2. 创建窗口
window: vqt6.QWidget | t.CPtr = vqt6.QWidget()
window.setWindowTitle("vqt6 Hello")
window.resize(400, 300)

# 3. 创建标签
label: vqt6.QLabel | t.CPtr = vqt6.QLabel("你好，Viper！", window)
label.move(50, 50)

# 4. 显示并进入事件循环
window.show()
app.exec()
```

## 设计原则

1. **不透明指针**：Viper 端不直接操作 Qt6 C++ 类（`QWidget*`、`QString*` 等），所有操作通过 C 桥接函数 `vqt6_xxx()` 转发。
2. **t.State 声明**：所有 FFI 函数返回 `t.State`，C 桥接层函数实现负责实际操作。
3. **句柄化对象模型**：Viper 端的对象是 `t.CPtr`（不透明指针），C 端管理生命周期（构造函数/析构函数）。
4. **跨平台**：同一套 C 桥接代码可在 Windows / Linux / macOS 编译（差异在 Qt6 安装路径）。

## 当前状态

- [x] 架构设计
- [x] FFI 覆盖：QtCore / QtWidgets / QtGui / QtNetwork
- [x] FFI 粒度：仅暴露 C 桥接函数
- [ ] FFI 声明文件编写中
- [ ] C 桥接层实现
- [ ] CMakeLists.txt 构建脚本
- [ ] Hello World 示例验证
