小编Geo*_*nch的帖子

HOWTO:用gtk(rust-gnome)回调的惯用Rust

我目前正在学习Rust,并希望用它来开发基于GUI的GTK +应用程序.我的问题涉及注册回调以响应GTK事件/信号并在这些回调中改变状态.我有一个工作但不优雅的解决方案,所以我想问一下是否有更清洁,更惯用的解决方案.

我已经将我的代码实现为具有方法实现的结构,其中结构维护对GTK小部件的引用以及它所需的其他状态.它构造一个传递给GtkWidget::connect*函数的闭包, 以便接收事件,绘制到画布等.这可能会导致借用检查器出现问题,我现在将解释.我有一些工作但(IMHO)非理想的代码,我将展示.

最初的非工作解决方案:

#![cfg_attr(not(feature = "gtk_3_10"), allow(unused_variables, unused_mut))]

extern crate gtk;
extern crate cairo;

use gtk::traits::*;
use gtk::signal::Inhibit;
use cairo::{Context, RectangleInt};


struct RenderingAPITestWindow {
    window: gtk::Window,
    drawing_area: gtk::DrawingArea,
    width: i32,
    height: i32
}

impl RenderingAPITestWindow {
    fn new(width: i32, height: i32) -> RenderingAPITestWindow {
        let window = gtk::Window::new(gtk::WindowType::TopLevel).unwrap();
        let drawing_area = gtk::DrawingArea::new().unwrap();
        drawing_area.set_size_request(width, height);
        window.set_title("Cairo API test");
        window.add(&drawing_area);

        let instance = RenderingAPITestWindow{window: window,
            drawing_area: drawing_area,
            width: width,
            height: height,
        };

        instance.drawing_area.connect_draw(|widget, cairo_context| …
Run Code Online (Sandbox Code Playgroud)

gtk idiomatic callback rust rust-gnome

9
推荐指数
1
解决办法
1577
查看次数

标签 统计

callback ×1

gtk ×1

idiomatic ×1

rust ×1

rust-gnome ×1