重新打开 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().

问题 是当我重新打开对话框时。按照步骤查看错误:

  1. 点击“点击kro jara!”按钮和 AboutDialog 将正确可见。
  2. 现在关闭 AboutDialog
  3. 再次点击“点击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) 
        });