ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CJQT 快速上手:仓颉语言跨平台桌面 GUI 开发指南

CJQT 快速上手:仓颉语言跨平台桌面 GUI 开发指南 CJQT 快速上手仓颉语言跨平台桌面 GUI 开发指南【免费下载链接】CJQT仓颉语言对qt封装库项目地址: https://gitcode.com/Cangjie-TPC/CJQTCJQT 是 Qt 仓颉语言绑定库将 Qt 5.14.2 的窗口、控件、布局与绘图类封装成仓颉风格 API让开发者不用写 C 就能做跨平台桌面 GUI 应用目前可在 Windows、Linux 等 64 位系统上构建使用。不碰 C 也能做的桌面小工具用仓颉语言做一个内部小工具或个人桌面应用GUI 层过去只有两条路自己包一层 C Qt 的 FFI或者直接用 C 写 Qt。前者要处理指针传递和对象生命周期后者对不熟 C 的仓颉开发者来说门槛偏高。CJQT 就是为解决这个问题出现的它把 QWidget、QMainWindow、QPushButton 这些常用类封装成带父窗口参数、支持闭包回调的仓颉 API下面直接上手。两种写法的差别可以从这张表看出来对比维度传统 C QtCJQTQt 仓颉绑定语言与内存C需关注对象归属与指针传递仓颉语言内存安全无需手动管理事件绑定声明槽函数或 connect 到仿函数connect 直接接仓颉闭包或方法引用构建方式qmake/CMakecjpm 一站式构建native 绑定库编译一次即可示例行数窗口按钮弹窗约 30 行含 include 与头文件22 行行数口径完成窗口按钮点击弹窗同样功能的最小可编译示例的源文件行数供直观参考。22 行代码跑通第一个窗口理解仓颉 GUI 开发最快的方式是先跑起来。下面这个示例来自 example/hello创建主窗口、放一个按钮、点击后弹出消息框package main import cjqt.widgets.* import cjqt.gui.* main() { QApplication.create() let win QMainWindow() win.setWindowTitle(CJQT示例) win.resize(400, 300) let button QPushButton(win) button.setGeometry(150, 80, 100, 24) button.setText(点我) button.clicked.connect() { d QMessageBox.information(win, 提示, 按钮被点击了) } win.show() QApplication.exec() win.delete() QApplication.delete() }几个关键点QApplication.create()初始化应用QApplication.exec()进入事件循环两者是固定搭配控件构造时传入父窗口winclicked.connect()的参数是仓颉闭包d 中的d是事件参数用不到时可以忽略它的值。三步完成环境搭建 环境一共要准备三样东西仓颉编译器、Qt 5.14.264 位、CJQT 源码。注意仓颉目前仅支持 64 位系统所以 Qt 必须装 64 位版本。第一步安装仓颉编译器用cjc --version验证需 v0.35.6 及以上版本# 验证仓颉编译器版本 cjc --version第二步从 Qt 官网下载 5.14.2 安装包并安装装完验证版本# Linux 下安装 Qt 5.14.2 安装包 chmod x qt-opensource-linux-x64-5.14.2.run ./qt-opensource-linux-x64-5.14.2.run # 验证 Qt 版本 qmake --versionLinux 还需要一个运行时依赖一并安装# 安装 Linux 运行所需依赖库 sudo apt-get install libxkbcommon-x11-0第三步克隆源码并用 cjpm 构建。CJQT 分两层native/是 C 绑定源码用 Qt Creator 或 cmake 构建到native/build只需做一次src/是仓颉封装层用 cjpm 构建# 克隆 CJQT 项目源码 git clone https://gitcode.com/Cangjie-TPC/CJQT.git cd CJQT # 仓颉封装层构建native 已构建且 cjpm.toml 指向 ./native/build 时可直接执行 cjpm build验证方法运行自带的 hello 示例弹出带按钮的窗口即成功# 运行 hello 示例验证环境 ./example/hello/run.shWindows 下对应执行.\example\hello\run.ps1。编写界面控件、布局与信号槽控件与事件、布局嵌套、信号槽连接这三块覆盖了仓颉 GUI 开发中大部分日常场景。创建控件与绑定点击事件控件都是先构造、后配置构造函数传父窗口然后用 set 系列方法配置外观事件用 connect 绑定闭包let label QLabel(win) label.setGeometry(120, 20, 200, 40) label.setText(Hello CJQT!) label.setFontSize(24) label.setFontColor(QColor.Red) let button QPushButton(win) button.setGeometry(150, 80, 100, 24) button.setText(点我) button.clicked.connect() { d QMessageBox.information(win, 提示, 被点击了) }定位有两种方式setGeometry绝对定位适合固定尺寸窗口布局管理器适合随窗口缩放。两种方式可以混用QGroupBox、QFrame 等容器控件内部也可以用布局。布局嵌套由内到外组装界面QVBoxLayout 纵向排列QHBoxLayout 横向排列用addLayout把小布局嵌进大布局最后setLayout挂到容器控件上。以登录窗口的输入区为例let mainLayout QVBoxLayout() let userRow QHBoxLayout() userRow.addWidget(QLabel(text: 用户名:)) userRow.addWidget(QLineEdit()) let pwdRow QHBoxLayout() pwdRow.addWidget(QLabel(text: 密码:)) let pwdEdit QLineEdit() pwdEdit.setEchoMode(EchoMode.Password) pwdRow.addWidget(pwdEdit) mainLayout.addLayout(userRow) mainLayout.addLayout(pwdRow) let centralWidget QWidget() centralWidget.setLayout(mainLayout) win.setCentralWidget(centralWidget)规律是固定的每一行一个 QHBoxLayout行与行之间用 QVBoxLayout 串起来QMainWindow 通过setCentralWidget挂上整个容器。QLineEdit 支持占位符、输入掩码、校验器如 QDoubleValidator 限制范围与小数位等配置在 example/lineEdit 中可以看到完整用法。信号槽与闭包QTimer 驱动定时逻辑所有 Qt 信号都用同一套 connect 语法闭包、方法引用都行。QAction 的triggered、QLineEdit 的textChanged、QSlider 的valueChanged都是如此。配合 QTimer 可以做定时逻辑let timer QTimer() timer.setInterval(1000) var count 0 timer.timeout.connect() { d count count 1 if (count 10) { timer.stop() QMessageBox.information(win, 提示, 10秒到了) } } timer.start()传方法引用时更简洁action.triggered.connect(openFile)回调方法的签名由信号决定带一个 bool 参数后面记事本里会再次看到这种写法。完整示例带文件读写的仓颉记事本example/notepad 是一个结构完整的记事本功能清单如下核心思路是继承 QMainWindow 做自定义窗口类菜单、工具栏、动作QAction各自独立方法创建。菜单动作绑定部分func createFileMenu() { let menuFile menuBar().addMenu(文件(F)) let actionNew menuFile.addAction(QIcon(./images/new.png), 新建) actionNew.triggered.connect(newDocument) let actionOpen menuFile.addAction(QIcon(./images/open.png), 打开···) actionOpen.triggered.connect(openFile) menuFile.addSeparator() let actionSave menuFile.addAction(QIcon(./images/save.png), 保存) actionSave.triggered.connect(saveFile) }注意addAction(图标, 文本)直接返回 QAction一步完成创建和挂菜单同一个 QAction 还能同时挂到工具栏上行为只需 connect 一次。文件打开与读取部分func openFile(bool: Bool) { let fileName QFileDialog.getOpenFileName( parent: this, caption: 打开文档, dir: ., filter: 文本文件(*.txt) ) if (fileName.isEmpty()) { return } setWindowTitle(fileName) var file: File File(fileName, OpenOption.Open(true, false)) let data String.fromUtf8(file.readToEnd()) textEdit.setText(data) file.close() }这里 Qt 和仓颉标准库自然混用QFileDialog 负责选文件读文件本身交给std.fs的 File保存则是file.write(textEdit.toPlainText().toArray())。完整源码见 example/notepad 目录Linux 下./example/notepad/run.sh即可运行。项目现状与参与方式CJQT 仍处于持续封装阶段三个核心模块的现状如下各模块的逐类封装进度清单在 doc/ 目录的 qt_widgets.md、qt_core.md、qt_gui.md 中维护当前库的测试行覆盖率约 73%。参与方式有三条路径提 Issue提交 bug 时附上系统、Qt 版本、复现步骤和错误日志方便维护者定位。提 PR按进度清单认领一个未完成的控件或方法实现并补上 test/ 下的测试用例后提交。补文档完整 API 文档在 doc/api/设计文档在 doc/ 目录教程和使用说明都可以往这里加。1.0 版本与后续CJQT 的路线规划是近期保证各示例可运行、中期完成常用 Qt 类封装、长期覆盖完整 Qt 类封装1.0 版本的重点就是补齐 QWidgets 剩余控件的封装。项目仓库名为 Cangjie-TPC/CJQT维护者信息列在 README 中Issue 区是讨论和跟进进度的主要入口。等你下次需要给团队工具配一个桌面界面时不妨直接用仓颉试一次。【免费下载链接】CJQT仓颉语言对qt封装库项目地址: https://gitcode.com/Cangjie-TPC/CJQT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表