有时 GTK 模态对话框不是模态的 --- 错误或功能?

Posted

技术标签:

【中文标题】有时 GTK 模态对话框不是模态的 --- 错误或功能?【英文标题】:Sometimes GTK modal dialogs are not modal --- bug or feature? 【发布时间】:2012-02-14 23:25:12 【问题描述】:

当我在 GTK(GTK2 或 GTK3)中创建自定义对话框并将其设置为模式时,我的应用程序的其他窗口的所有输入都将被忽略。这几乎总是有效,但在某些情况下会失败。

当我在对话框中添加一个包含 TreeView 的 ScrolledWindow 时,它仍然可以正常工作。 但是如果我用条目填充 TreeView 直到 ScrolledWindow 开始显示其滚动条 --- 模式突然丢失,我可以点击其他窗口!

这是我能够设置的最基本的示例。它是用 Vala 写的,但你会明白的:

class MyDialog: Gtk.Dialog 

    public MyDialog() 
        this.modal = true;

        var data = new Gtk.ListStore(1, typeof(string)); 

        // increase this number -- the dialog is not modal anymore!
        for (int i=0; i<2; ++i) 
            Gtk.TreeIter current;
            data.append(out current);
            data.set(current, 0, "Lorem Ipsum"); 
        

        var render = new Gtk.CellRendererText();

        var column = new Gtk.TreeViewColumn();
            column.pack_start(render, true);
            column.add_attribute(render, "text", 0);

        var treeview = new Gtk.TreeView.with_model(data);
            treeview.append_column(column);
            treeview.show();

        var scroll = new Gtk.ScrolledWindow(null, null);
            scroll.set_size_request(100, 100);
            scroll.add(treeview);
            scroll.show();

        (this.get_content_area() as Gtk.Box).add(scroll);
    


int main (string[] args) 
    Gtk.init (ref args);

    var window = new Gtk.Window();

    window.set_default_size(350, 170);
    window.destroy.connect(Gtk.main_quit);

    var button = new Gtk.Button.with_label("Click me!");
    button.clicked.connect(() => 
        var dialog = new MyDialog();
        dialog.set_transient_for(window);
        dialog.run();
        dialog.destroy();
    );

    window.add(button);
    window.show_all();

    Gtk.main();
    return 0;

编译:

valac --pkg gtk+-3.0 main.vala

我错过了什么吗?这种行为是想要的吗?或者它是一个错误?如果是这样,是否有解决方法?

编辑:我进一步调查:卸载 Ubuntu 的覆盖滚动条后问题消失。所以还没有解决,但我知道我必须在哪里报告这个......

【问题讨论】:

可能是一个错误。您应该在 bugzilla.gnome.org 上报告。 我在Launchpad 发现了一个相关的错误报告,让我们看看它什么时候修复... 看起来是 Ubuntu 的 bug。一直讨厌那些“功能” 在 f16 上运行良好,添加更多元素,没问题,您应该关闭该问题。 【参考方案1】:

绝对是一个错误。发布错误报告和/或升级您的 GTK+ 库。

【讨论】:

它不是 Gtk+ 库。它在我的 Linux Mint 系统中运行良好。

以上是关于有时 GTK 模态对话框不是模态的 --- 错误或功能?的主要内容,如果未能解决你的问题,请参考以下文章

验证错误laravel后保持模态对话框打开

捕获新创建的模态对话框的窗口句柄

SWT 模态对话框不是模态的

如何使 QDialog 仅针对其非模态父窗口而不是所有祖父窗口成为模态?

VS2017 MFC应用中添加模态对话框时为其添加类弹出如下错误

如何在 C# 中单击通知图标来聚焦模态对话框?