首页 > 解决方案 > (Rust + GTK) GtkFrame 小部件的显示内容不能在点击 GtkButton 小部件的事件句柄关闭时被动态替换

问题描述

我被一个技术问题困住了,希望能得到你的聪明帮助。

在实现以“设置向导”命名的 GUI 应用程序的过程中,我偶然发现了一个麻烦,在该应用程序中,单击上一个/下一个按钮预计会动态更改显示内容。我被卡住了,因为上一个/下一个按钮的单击事件句柄只能删除旧内容,但不能添加新内容。因此,在单击下一个按钮后,显示区域变为空。

在我的程序中,编写了一个闭包(以“render”命名)将小部件填充到显示区域,这是一个 GtkFrame 小部件。奇怪的是,同一个闭包能够将子小部件(例如 gtk::Box)添加到 GtkFrame 并在 GUI 初始化期间显示它(即在“application.connect_activate(...)”中),但在用于接收点击信号的事件句柄关闭。我不确定我失去了什么。

我的小部件如下

GtkApplicationWindow

脚手架向导.zip

我的源代码在这里。在 (cargo run) 之后,加载 (assets) 文件夹下的 JSON 文件,该文件在顶层有一个 (prompts) 节点。(提示)对象的第一个条目将在 GUI 初始化期间针对第一个场景呈现,其中仅使用来自 JSON 的(消息)属性值绘制 GtkLabel。

图片:json文件

目前,由于 GtkFrame::remove(),单击下一个按钮会删除 GtkLabel 小部件。然后,单击预览按钮对重新绘制 GtkLabel 小部件无效,即使 GtkFrame::add() 运行时没有任何恐慌!如果您使用包含LLDB插件的 VSCode 打开源代码,在键盘上键入 F5 键将启动调试模式。然后,观察到 GtkFrame::add() 运行时带有断点。

下面的#4 步骤对于单击按钮的场合无效。

图片:代码片段 1

图片:代码片段 2

我想解决这个问题,但我不知道什么是错误的。

我刚刚做了一个测试。移除 GtkFrame 小部件的子小部件的操作甚至会导致 GtkFrame::set_label(Some("***")) 的失败。也就是说,

(1) 如果语句 "step_viewer.remove(...)" 及其周围的 "if" 分支被替换为 "step_viewer.set_label(Some(&format!("test-index {}", step_index)[..] ))”,每次点击下一个/上一个按钮时,GtkFrame 小部件的标签文本总是会改变。

(2) 如果“step_viewer.remove(...)”和“step_viewer.set_label(Some(&format!("test-index {}", step_index)[..]))”同时守恒, “step_viewer.set_label(...)” 也不会生效。

所以,我怀疑“step_viewer.remove(&...)”会导致“step_viewer.add(&...)”失败。也许,会发生以下情况之一

(1) 禁止动态移除 GtkFrame 控件的子控件或 (2) 是 GtkFrame::remove() 方法的错误

标签: user-interfacerustsignalsgtk3

解决方案


推荐阅读