问题标签 [rust-gnome]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
777 浏览

gtk - 使用 rust-gnome 时如何将自己的数据发送到 GTK 回调?

...或者,我如何子类化 gtk::Widget?

我的 中有以下依赖项Cargo.toml

我想创建自己的小部件类型(用于渲染分形)。我有:

但是当redraw被调用时, w 当然是 thegtk::DrawingArea而不是 my FractalWidget。我已经尝试使用闭包进行调用connect_draw,但没有设法在result其中使用(我尝试过Box将结果move输入到 lambda 中,但我对此很陌生,所以可能有一些我没有尝试过的方法) .

所以,我的实际问题是:有没有办法将更多数据发送到 rust-gnome 重绘方法(和其他类似的回调),或者有没有办法扩展小部件结构以包含我自己的数据?

0 投票
1 回答
2272 浏览

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

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

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

初始,非工作解决方案:

上面的代码编译失败,因为闭包 RenderingAPITestWindow::new被创建并传递给对 GtkWidget::connect*方法的调用尝试借用instance。编译器指出,闭包可能比声明它们​​的函数寿命更长,并且instance由外部函数拥有,因此存在问题。鉴于 GTK 可能会在未指定的时间内保留对这些闭包的引用,我们需要一种可以在运行时确定生命周期的方法,因此我接下来要解决RenderingAPITestWindow实例被包装在 Rc<RefCell<...>>.

包装RenderingAPITestWindow实例编译但在运行时死亡:

上面的解决方案可以编译,但不是特别漂亮:

  • RenderingAPITestWindow::new返回一个 Rc<RefCell<RenderingAPITestWindow>>而不是一个 RenderingAPITestWindow
  • 访问字段和方法RenderingAPITestWindow很复杂,因为Rc<RefCell<...>>必须打开;它现在需要 wrapped_instance.borrow().some_method(...)而不仅仅是 instance.some_method(...)
  • 每个闭包都需要它自己的 ; 的克隆wrapped_instance。尝试使用wrapped_instance将尝试借用一个对象 - 包装器而不是RenderingAPITestWindow这次 -RenderingAPITestWindow::new像以前一样拥有

虽然上面的编译,它在运行时死了:

这是因为调用window.show_all()导致 GTK 初始化小部件层次结构,导致绘图区域小部件接收size-allocate事件。访问要调用的窗口 show_all()需要Rc<RefCell<...>>打开(因此 wrapped_instance.borrow().window.show_all();)并借用实例。在借用结束show_all()返回之前,GTK 调用绘图区域的size-allocate事件处理程序,这会导致调用与其相连的闭包(上面的 4 行)。闭包尝试借用对RenderingAPITestWindow实例 ( wrapped_instance_for_sizealloc.borrow_mut().on_size_allocate(rect);) 的可变引用以调用该on_size_allocate方法。这试图借用一个可变引用,而第一个不可变引用仍在范围内。第二次借用导致运行时恐慌。

到目前为止,我设法开始工作的工作RenderingAPITestWindow但 - 恕我直言 - 不优雅的解决方案是拆分为两个结构,将由回调修改的可变状态移动到一个单独的结构中。

RenderingAPITestWindow拆分结构的工作但不优雅的解决方案:

虽然上面的代码可以按要求工作,但我想找到一种更好的前进方式;我想问一下是否有人知道更好的方法,因为上述方法使编程过程相当复杂,需要使用Rc<RefCell<...>>和拆分结构来满足 Rust 的借用规则。

0 投票
1 回答
1005 浏览

gtk - 锈 & GTK+3。如何创建包含一些 glib::Value 类型元素的数组,这些元素可以转换为 &[&ToValue] 类型?

我正在使用 Rust 和 GTK+ 3 的绑定(称为 Gtk-rs 或 rust-gnome)创建 GUI 应用程序。我想使用方法将一些数据插入gtk::ListStoreGtkListStoreinsert_with_values

工作示例,但只有一列: 如果我有一列,我可以插入数据:

但是,如果我有更多列,我不知道如何交出更多数据。我知道它应该在内部调用gtk_list_store_insert_with_valuesv() 所以我可能需要一个数组或切片,但是如果我执行以下操作:

想在数组中传递两个元素,不工作

它在编译期间给了我:

错误:[&glib::Value; 2]: glib::IsA<glib::Object>不满足特征界限 [E0277]

我不知道如何克服它。

不工作 MCVE

main.rs

货运.toml

0 投票
1 回答
747 浏览

combobox - 如何在 Rust 的 gtk-rs 绑定中的 ListStore 中添加 ListStore?

我想使用gtk-rs bindingsTreeView创建包含ComboBoxes 的程序。

为了获得 的数据GtkCellRendererCombo,我需要一个GtkTreeModel *,但我不知道如何ListStoreListStore.

目前我只有一个简单的TreeView. 我想要一个ComboBox内部 1 列(标题“f64”):

我曾尝试添加gtk::Type:BaseBoxedtotypes_inside_columns然后添加一个boxed ListStoreto array_of_data,但Box无法通过方法成功转换to_value()为type ToValue

补充:该程序在运行时出现恐慌:

0 投票
1 回答
46 浏览

rust - 在 Fn 中安全地移动或取消引用 Receiver?

我正在开发一个应用程序,该应用程序可以选择使用 GUI 来显示大致如下结构的视频数据:

gtk rust 库需要application.connect_activate在启动时传递一个 Fn 回调,所以我不能使用 FnOnce 或 FnMut 闭包来移动回调中的 glib::Receiver。编译器抛出此错误:

我试图通过包装window_rx在 Rc 中来避免移动,即:

但是在我的build_ui函数中取消引用 Rc 时,我得到了这个错误:

到目前为止,我使用的后备方法是将通道创建和线程创建移到我的build_ui函数中,但由于不需要 GUI,如果不使用 GUI,我希望完全避免使用 GTK 和回调。有什么方法可以安全地window_rx在闭包内移动,或者在回调中取消引用它而不会导致错误?

0 投票
0 回答
61 浏览

rust - 无法返回引用当前函数拥有的数据的值

我是Rust新手,刚开始学习,想搭建一个简单的GUI,发现这个库iced有一个很棒的API,但是没有资源可以学习,文档也不清楚

我正在尝试构建两个组件,第一个组件是显示一篇文章,第二个是显示包含第一个的文章列表

这是我的代码

问题是,当我尝试从中返回 create rwoMarkComponent并将其推送到MarkComponents Row它时会出现恐慌并出现此错误:

但是,当尝试将Text元素直接推入row其中时,可以正常工作,如下所示

但我想创建两个组件来分离事物并开始应用一些设计模式