重新打开 AboutDialog 显示一个空白对话框
Reopening AboutDialog shows a blank Dialog
我是 GTK 新手。我创建了一个带有 Button 的 ApplicationWindow。当按下按钮时,通过调用 show() 使 AboutDialog 可见。
我曾尝试 about.hide_on_delete()
、about.connect_delete_event()
和 about.connect_close()
来隐藏 AboutDialog。都给出相同的错误。
我不确定程序是否达到 about.connect_close()
.
问题 是当我重新打开对话框时。按照步骤查看错误:
- 点击“点击kro jara!”按钮和 AboutDialog 将正确可见。
- 现在关闭 AboutDialog
- 再次点击“点击kro jara!”按钮,问题就在那里。该对话框将无法正确显示。它将是空白的(我在下面添加了一张图片)。单击空白 space 只会一次又一次地打印相同的消息。
源代码:
use gtk::prelude::*;
use gio::prelude::*;
use gtk::{Application, ApplicationWindow, Button, AboutDialog};
fn main() {
let application = Application::new(
Some("com.github.gtk-rs.examples.basic"),
Default::default(),
).expect("failed to initialize GTK application");
application.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("GTK wala Program");
window.set_default_size(350, 70);
let about = AboutDialog::new();
about.set_comments(Some("Test App ka Comment hai."));
// about.hide_on_delete();
// about.connect_close(|a| {
// println!("About ka Dialog kar rahe hai!");
// a.hide();
// });
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(false)
});
let button = Button::with_label("Click kro jara!");
button.connect_clicked(move |_| {
println!("Clicked!");
about.show();
});
window.add(&button);
window.show_all();
});
application.run(&[]);
}
日志消息:
Clicked!
About ka Dialog kar rahe hai!
Clicked!
(test_about:14579): Gtk-CRITICAL **: 18:49:37.111: gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed
(test_about:14579): Gtk-CRITICAL **: 18:49:37.111: gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed
(test_about:14579): Gtk-CRITICAL **: 18:49:37.115: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed
重新打开时对话框的图像:
要抑制信号进一步传播,您应该使用Inhibit(true)
。否则,默认处理程序应 运行,这将破坏 window.
所以代码
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(false)
});
将成为
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(true)
});
我是 GTK 新手。我创建了一个带有 Button 的 ApplicationWindow。当按下按钮时,通过调用 show() 使 AboutDialog 可见。
我曾尝试 about.hide_on_delete()
、about.connect_delete_event()
和 about.connect_close()
来隐藏 AboutDialog。都给出相同的错误。
我不确定程序是否达到 about.connect_close()
.
问题 是当我重新打开对话框时。按照步骤查看错误:
- 点击“点击kro jara!”按钮和 AboutDialog 将正确可见。
- 现在关闭 AboutDialog
- 再次点击“点击kro jara!”按钮,问题就在那里。该对话框将无法正确显示。它将是空白的(我在下面添加了一张图片)。单击空白 space 只会一次又一次地打印相同的消息。
源代码:
use gtk::prelude::*;
use gio::prelude::*;
use gtk::{Application, ApplicationWindow, Button, AboutDialog};
fn main() {
let application = Application::new(
Some("com.github.gtk-rs.examples.basic"),
Default::default(),
).expect("failed to initialize GTK application");
application.connect_activate(|app| {
let window = ApplicationWindow::new(app);
window.set_title("GTK wala Program");
window.set_default_size(350, 70);
let about = AboutDialog::new();
about.set_comments(Some("Test App ka Comment hai."));
// about.hide_on_delete();
// about.connect_close(|a| {
// println!("About ka Dialog kar rahe hai!");
// a.hide();
// });
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(false)
});
let button = Button::with_label("Click kro jara!");
button.connect_clicked(move |_| {
println!("Clicked!");
about.show();
});
window.add(&button);
window.show_all();
});
application.run(&[]);
}
日志消息:
Clicked!
About ka Dialog kar rahe hai!
Clicked!
(test_about:14579): Gtk-CRITICAL **: 18:49:37.111: gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed
(test_about:14579): Gtk-CRITICAL **: 18:49:37.111: gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed
(test_about:14579): Gtk-CRITICAL **: 18:49:37.115: gtk_container_foreach: assertion 'GTK_IS_CONTAINER (container)' failed
重新打开时对话框的图像:
要抑制信号进一步传播,您应该使用Inhibit(true)
。否则,默认处理程序应 运行,这将破坏 window.
所以代码
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(false)
});
将成为
about.connect_delete_event(|a, _| {
println!("About ka Dialog kar rahe hai!");
a.hide();
Inhibit(true)
});