gtk-rs - rust - 使用结构方法作为信号的回调函数

问题描述 投票:0回答:1

connect_activate()
上调用
gtk::Application
时,我正在努力将方法作为回调函数传递,如下面的代码所示。我已经关闭以避免有关
&self
参数的麻烦,但现在我无法解决此生命周期问题 error[E0521]:借用的数据在相关函数之外逃逸.

处理此错误的最简单(最好是惯用的)方法是什么?

我需要回调(不仅是第一个)来访问结构字段。这个想法是,每个需要由应用程序操作的小部件都可以通过

GUI
结构访问。

struct GUI {
    app: Application,
    builder: Builder
}

impl GUI {
    // ... (code omitted)

    pub fn config(&self) {
        let callback = |app| self.on_activate(app);
        self.app.connect_activate(callback);
    }

    pub fn on_activate<'a>(&self, app: &'a Application) {
        self.builder.set_application(app);
        self.builder.add_from_file(UI_FILE).expect(ERR_FAILED_LOADING_UI);
        let win : ApplicationWindow = self.builder.object("win").expect(
            &format!("{} {}", ERR_OBJECT_NOT_FOUND, "win"));
        win.show_all();
    }
}
rust gtk gtk-rs
1个回答
0
投票

如果你还在寻找答案,我在为学习 Rust 编写的程序中遇到了同样的问题,并最终通过将对象实例保存在静态变量中来解决它。这没问题,因为 1) 程序是单线程的,并且 2) 我知道只有一个实例不会改变。 static 需要是可变的,因为它必须被设置,所以我必须提供访问函数,将所有访问包装在一个不安全的{}块中。

这个可行,但恐怕不是最好的解决方案。我正在尝试重构以删除静态实例。如果该结构是一个小部件子类并且回调返回一个小部件,您可以从小部件树中找到它。在我的例子中,该对象是一个 Window 子类,因此例如在按下按钮时我可以从 button.property("root") 获取它。对于基本的小部件交互来说,这就足够了,但我仍然有问题,即返回的是一个小部件,而不是我的对象,所以我需要找到如何向上转换它。

© www.soinside.com 2019 - 2024. All rights reserved.