问题标签 [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.
gtk - 使用 rust-gnome 时如何将自己的数据发送到 GTK 回调?
...或者,我如何子类化 gtk::Widget?
我的 中有以下依赖项Cargo.toml
:
我想创建自己的小部件类型(用于渲染分形)。我有:
但是当redraw
被调用时, w 当然是 thegtk::DrawingArea
而不是 my FractalWidget
。我已经尝试使用闭包进行调用connect_draw
,但没有设法在result
其中使用(我尝试过Box
将结果move
输入到 lambda 中,但我对此很陌生,所以可能有一些我没有尝试过的方法) .
所以,我的实际问题是:有没有办法将更多数据发送到 rust-gnome 重绘方法(和其他类似的回调),或者有没有办法扩展小部件结构以包含我自己的数据?
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 的借用规则。
gtk - 锈 & GTK+3。如何创建包含一些 glib::Value 类型元素的数组,这些元素可以转换为 &[&ToValue] 类型?
我正在使用 Rust 和 GTK+ 3 的绑定(称为 Gtk-rs 或 rust-gnome)创建 GUI 应用程序。我想使用方法将一些数据插入gtk::ListStore
(GtkListStore
)insert_with_values
工作示例,但只有一列: 如果我有一列,我可以插入数据:
但是,如果我有更多列,我不知道如何交出更多数据。我知道它应该在内部调用gtk_list_store_insert_with_valuesv() 所以我可能需要一个数组或切片,但是如果我执行以下操作:
想在数组中传递两个元素,不工作
它在编译期间给了我:
错误:
[&glib::Value; 2]: glib::IsA<glib::Object>
不满足特征界限 [E0277]
我不知道如何克服它。
不工作 MCVE
main.rs
货运.toml
combobox - 如何在 Rust 的 gtk-rs 绑定中的 ListStore 中添加 ListStore?
我想使用gtk-rs bindingsTreeView
创建包含ComboBox
es 的程序。
为了获得 的数据GtkCellRendererCombo
,我需要一个GtkTreeModel *
,但我不知道如何ListStore
在ListStore
.
目前我只有一个简单的TreeView
. 我想要一个ComboBox
内部 1 列(标题“f64”):
我曾尝试添加gtk::Type:BaseBoxed
totypes_inside_columns
然后添加一个boxed ListStore
to array_of_data
,但Box
无法通过方法成功转换to_value()
为type ToValue
。
补充:该程序在运行时出现恐慌:
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
在闭包内移动,或者在回调中取消引用它而不会导致错误?
rust - 无法返回引用当前函数拥有的数据的值
我是Rust新手,刚开始学习,想搭建一个简单的GUI,发现这个库iced有一个很棒的API,但是没有资源可以学习,文档也不清楚
我正在尝试构建两个组件,第一个组件是显示一篇文章,第二个是显示包含第一个的文章列表
这是我的代码
问题是,当我尝试从中返回 create rwoMarkComponent
并将其推送到MarkComponents Row
它时会出现恐慌并出现此错误:
但是,当尝试将Text
元素直接推入row
其中时,可以正常工作,如下所示
但我想创建两个组件来分离事物并开始应用一些设计模式