2019.9 updated
首先新建一个rust应用程序工程
cargo new orbtkgui
:创建一个orbtkgui工程cd orbtkgui
:进入工程目录编辑orbtkgui目录下的cargo.toml,为工程中添加orbtk依赖
[dependencies]
orbtk = "0.2.27"
不推荐使用OrbTk 0.2.27版本,OrbTk在0.3.0版本进行了重新开发,api和以前的版本不兼容
推荐在cargo.toml的dependencies中用如下方式,添加orbtk最新版本依赖:
[dependencies]
orbtk = { git = https://gitlab.redox-os.org/redox-os/orbtk.git }
在src/main.rs中输入如下源代码:
use orbtk::prelude::*;
fn main() {
Application::new()
.window(|ctx| {
Window::create()
.title("OrbTk - helloworld")
.position((100.0, 100.0))
.size(420.0, 320.0)
.child(TextBlock::create().text("Hello World!").build(ctx))
.build(ctx)
})
.run();
}
ok,第一个orbtk gui项目已经创建完成,使用cargo run
编译运行试试
在编译的时候大多数人会遇到如下错误:
note: ld: cannot find -lSDL2
这是因为缺少SDL2库造成的。orbtk使用SDL进行图形界面绘制,所以必须安装SDL2库。
如果没有遇到任何问题,直接编译成功,请忽略本节。
解决方法
1. 安装SDL2
在msys2中可以直接pacman -S sdl2
安装。
如果没有使用msys2,可以直接下载安装。
2. 设置环境变量
orbtk项目在运行时需要SDL2.dll,在编译时需要链接SDL2.lib(或者SDL2.a)。所以需要
不想设置环境变量的同学,也可以在命令行输入如下脚本设置当前命令行环境。
set path=C:\SDL2\bin;%path%
set LIBRARY_PATH=C:\SDL2\lib
这是windows系统的设置方法,linux,unix,mac系统类似
windows上msys2设置方法
没有使用msys2的同学可以略过这一段。
msys2里安装SDL2方法:
pacman -S SDL2
安装完后,SDL2.dll位于C:\msys64\mingw64\bin目录下,SDL2.lib位于C:\msys64\mingw64\lib目录下。
切记,在msys2 启动后的bash里用LIBRARY_PATH=/C/msys64/mingw64/lib
设置环境变量是不行的。rust编译器是在windows下运行的,不是在msys2 shell内,只能用C:\msys64这种windows风格路径。那么怎么配置呢?
把set LIBRARY_PATH=C:\msys64\mingw64\lib添加到msys2_shell.cmd中,在启动msys2前时设置环境变量就ok了。
cargo run
我们就可以看到helloworld的窗口了。
整个程序的代码很简单
第一句use orbtk::prelude::*;
引用orbtk库
使用
use orbtk::*;
引用orbtk库也是可以的。但是推荐使用
use orbtk::prelude::*;
,这样导入的内容会比use orbtk::*;
少一点。
但是导入的都是orbtk库编写者认为最常用的部分。
第二句fn main() {...}
定义了main函数
main函数中只有一句代码:
Application::new()
.window(|ctx| {
Window::create()
.title("OrbTk - helloworld")
.position((100.0, 100.0))
.size(300.0, 200.0)
.child(TextBlock::create().text("Hello World!").build(ctx))
.build(ctx)
})
.run();
Application::new()
新建了一个Application对象。最关键的代码主要在Application对象的.window()方法的参数内,.window()的参数是一个函数,函数的参数为&mut BuildContext
。所以我们看到代码是一个闭包:|ctx|{...}
,闭包内部才是真正创建窗口的代码,具体为:
在这里我们看到,这三个函数是一个接一个的连续调用的,使用了链式调用的形式。
链式调用原理很简单,实际上就是每个方法然后返回对象本身self。window对象调用了.title()方法后,返回自身。实际上不用链式,这样调用也是可以的:
let window=window.title("title")
let window=window.size(300.0,200.0)
所以链式调用的.title(),.position(),.size()的顺序是可以随意改变的。
.title(),.position(),.size()实际上就是为window对象设置属性。
比如:.title()其实其他语言里的window.title="title string"是相同的。
在使用orbtk库中,窗口及控件(按钮、文本框等等)的属性设置都可以使用链式调用的。
window的.child()方法内,创建了一个TextBlock控件,用来显示文本:
TextBlock::create().text("Hello World!").build(ctx))
TextBlock::create()
函数创建一个TextBlock控件对象。.text()方法设置文本,.build(ctx)构建控件。
本文代码在https://github.com/hustlei/RustGuiOrbtkTutorial
可以使用如下命令编译运行
cargo run --bin helloworld
文章分类:rust语言Orbtk GUI库入门