我目前正在学习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)