orbtk的api在2019.2进行了修改,该文章为2018版
新版请转[新版orbtk gui基础]
rust目前已经有非常多的GUI方案,大多数是绑定的其他语言编写的库,如gtk绑定,qt绑定等等。
如果想看有哪些GUI库可以参考:
个人比较推荐2个:
orbtk是redox(rust语言操作系统)项目组开发的,redox的gui用的就是orbtk。orbtk是跨平台的gui,不仅支持Redox OS,还支持Linux, macOS, Windows系统。
orbtk的特点:
orbtk基于SDL2,所以依赖SDL2库。
orbtk的开发受到了Flutter、React、Yew等的启发,所以API与这些库有些类似。目前(2018)orbtk还有很多功能不完善,正在开发中,根据官网,orbtk未来计划如下:
目前,不支持运行时修改widgets,这是硬伤啊,所以只能用在比较简单的GUI上,希望能尽快增加。
首先新建一个rust应用程序工程
cargo new orbtkgui
:创建一个orbtkgui工程cd orbtkgui
:进入工程目录然后,在cargo.toml中添加orbtk依赖
[dependencies]
orbtk = "0.2.27"
如果想用最新的orbtk版本,可以在cargo.toml的dependencies行添加如下代码:
orbtk = { git = https://gitlab.redox-os.org/redox-os/orbtk.git }
OrbTk 0.3.0版本进行了重新开放,和以前的版本不兼容
然后,在main.rs中输入如下代码:
use orbtk::*;
fn main() {
let mut application = Application::default();
application
.create_window()
.with_bounds(Bounds::new(100, 100, 640, 420))
.with_title("OrbTk - simple gui")
.with_root(Template::default())
.build();
application.run();
}
第一个orbtk gui项目已经创建完成,使用cargo run
编译运行,我们会发现,没法编译,出现如下错误:
note: ld: cannot find -lSDL2
这是因为orbtk使用SDL进行图形界面绘制,所以必须安装SDL2库。
安装SDL2
在msys2中可以直接pacman -S sdl2
安装。
如果没有使用msys2,可以直接下载安装。
设置环境变量
orbtk项目在运行时需要SDL2.dll,在编译时需要链接SDL2.lib(或者SDL2.a)。所以需要把SDL2.dll的目录添加到path环境变量。把SDL2.lib目录添加到LIBRARY_PATH环境变量。
不想设置环境变量的同学,也可以在命令行输入如下脚本设置当前命令行环境。
set path=C:\msys64\mingw64\bin;%path%
set LIBRARY_PATH=C:\msys64\mingw64\lib
本人用的windows系统,非win系统类似
用msys2的同学切记,在msys2 shell里用 LIBRARY_PATH=/C/msys64/mingw64/lib是不行的。因为msys2中gcc时在windows下运行的,不是在msys2 shell内。可以把set LIBRARY_PATH=C:\msys64\mingw64\lib添加到msys2_shell.cmd中,在启动msys2时设置环境变量。
ok,所有工作完成了,cargo run
我们就可以看到一个空白的窗口了。
代码很简单
第一句use orbtk::*;
引用orbtk库
main函数中let mut application = Application::default();
创建一个application对象
main函数中
application
.create_window()
.with_bounds(Bounds::new(100, 100, 640, 420))
.with_title("OrbTk - simple gui")
.with_root(Template::default())
.build();
.with_title()
其实和.title="title string"
是相同的,所以.with_bounds(), .with_title(), .with_root()三个函数顺序可以随意调整。我们可以看看源码:
pub fn with_bounds(mut self, bounds: Rect) -> Self {
self.bounds = bounds;
self
}
windowbuilder的.with_xxx()函数的定义都类似。就是设置的property的值,然后返回self,方便链式调用。windowbuider主要设置属性的函数有:
with_bounds(mut self, bounds: Rect):设置窗口大小和位置
with_title>(mut self, title: S):设置窗口标题
with_theme(mut self, theme: Theme):设置css样式,theme实际上是一个包含css样式的字符串
with_root(mut self, root: Template):设置窗口的根控件,orbtk的所有控件(button,combox等)都是Template
with_debug_flag(mut self, debug: bool):设置是否为debug模式,debug为true时,会在命令行控制台显示调试信息
最后一句application.run();
渲染并启动消息循环。
本文代码在https://github.com/hustlei/RustGuiOrbtkTutorial
可以使用cargo run --bin start
命令编译运行