user-interface - (Rust + GTK) GtkFrame 小部件的显示内容不能在点击 GtkButton 小部件的事件句柄关闭时被动态替换
问题描述
我被一个技术问题困住了,希望能得到你的聪明帮助。
在实现以“设置向导”命名的 GUI 应用程序的过程中,我偶然发现了一个麻烦,在该应用程序中,单击上一个/下一个按钮预计会动态更改显示内容。我被卡住了,因为上一个/下一个按钮的单击事件句柄只能删除旧内容,但不能添加新内容。因此,在单击下一个按钮后,显示区域变为空。
在我的程序中,编写了一个闭包(以“render”命名)将小部件填充到显示区域,这是一个 GtkFrame 小部件。奇怪的是,同一个闭包能够将子小部件(例如 gtk::Box)添加到 GtkFrame 并在 GUI 初始化期间显示它(即在“application.connect_activate(...)”中),但在用于接收点击信号的事件句柄关闭。我不确定我失去了什么。
我的小部件如下
GtkApplicationWindow
- GtkPanel : 垂直方向
- GtkScrolledWindow
- Gtk视口
- GtkAlignment : 居中对齐
- Gtk Frame : **当单击下一个/上一个按钮时,我想动态更改其唯一的一个子小部件。
- GtkAlignment : 居中对齐
- Gtk视口
- GtkScrolledWindow
- GtkButtonBox : 垂直方向**
- GtkButton : 预览
- GtkButton : 下一个
- GtkButton : 提交
我的源代码在这里。在 (cargo run) 之后,加载 (assets) 文件夹下的 JSON 文件,该文件在顶层有一个 (prompts) 节点。(提示)对象的第一个条目将在 GUI 初始化期间针对第一个场景呈现,其中仅使用来自 JSON 的(消息)属性值绘制 GtkLabel。
目前,由于 GtkFrame::remove(),单击下一个按钮会删除 GtkLabel 小部件。然后,单击预览按钮对重新绘制 GtkLabel 小部件无效,即使 GtkFrame::add() 运行时没有任何恐慌!如果您使用包含LLDB插件的 VSCode 打开源代码,在键盘上键入 F5 键将启动调试模式。然后,观察到 GtkFrame::add() 运行时带有断点。
下面的#4 步骤对于单击按钮的场合无效。
我想解决这个问题,但我不知道什么是错误的。
我刚刚做了一个测试。移除 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() 方法的错误
解决方案
推荐阅读
- flask - Nginx 为同一域下的多个烧瓶应用程序提供 404
- c# - 无法正确呈现 @Html.PasswordFor
- r - R用逻辑变量转置数据帧
- mapbox-gl-js - 如何为每个磁贴请求添加额外的标头和令牌
- php - 在php中将值设为NULL而不是空
- entity-framework - Linq - 创建包含集合的新对象
- flutter - 颤振,cupertinotabview 键盘没有出现
- java - JAVA & SQL 数据库保存更改
- ios - 集合视图 performBatchUpdates 在 swift 中随机崩溃
- python - 无法加载纹理:Guide.png