# 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 示例验证