rust语言Orbtk GUI库-2.HelloWorld

2019.9 updated

1. 创建工程

首先新建一个rust应用程序工程

  1. cargo new orbtkgui:创建一个orbtkgui工程
  2. cd orbtkgui:进入工程目录

2. 为工程配置orbtk库

编辑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 }

3. helloworld代码

在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();
}

4. 编译

ok,第一个orbtk gui项目已经创建完成,使用cargo run编译运行试试

cannot find -lSDL2错误解决办法

在编译的时候大多数人会遇到如下错误:

 note: ld: cannot find -lSDL2

这是因为缺少SDL2库造成的。orbtk使用SDL进行图形界面绘制,所以必须安装SDL2库。

如果没有遇到任何问题,直接编译成功,请忽略本节。

解决方法
1. 安装SDL2

在msys2中可以直接pacman -S sdl2安装。

如果没有使用msys2,可以直接下载安装。

2. 设置环境变量

orbtk项目在运行时需要SDL2.dll,在编译时需要链接SDL2.lib(或者SDL2.a)。所以需要

  • 把SDL2.dll的目录添加到path环境变量。
  • 把SDL2.lib目录添加到LIBRARY_PATH环境变量。

不想设置环境变量的同学,也可以在命令行输入如下脚本设置当前命令行环境。

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的窗口了。

orbtk-gui

5. 代码说明

整个程序的代码很简单

第一句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()方法创建了gui窗口
  • 最后调用.run()方法,运行程序。

最关键的代码主要在Application对象的.window()方法的参数内,.window()的参数是一个函数,函数的参数为&mut BuildContext。所以我们看到代码是一个闭包:|ctx|{...},闭包内部才是真正创建窗口的代码,具体为:

  • Window::create()创建了一个Window对象
  • .title(),.position(),.size(),.child()分别设置窗口标题、位置、大小、和窗口的子控件
  • .build()使用构建window对象成为一个能够被显示的对象

在这里我们看到,这三个函数是一个接一个的连续调用的,使用了链式调用的形式。
链式调用原理很简单,实际上就是每个方法然后返回对象本身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库入门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hustlei

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值