没有临时父级的 GtkDialog 映射

Posted

技术标签:

【中文标题】没有临时父级的 GtkDialog 映射【英文标题】:GtkDialog mapped without a transient parent 【发布时间】:2015-07-05 03:59:44 【问题描述】:

我有一个内置在 Glade (3.18) 中的 GUI,它由 Python 3 程序调用(使用 PyGObject)。运行程序(Fedora 21)时我收到很多警告:

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

如何解决此警告?我尝试在 Glade 中为所有对话窗口填写字段 Transient for: main_window,但仍然出现警告。

【问题讨论】:

这正是我从官方 gtkmm 文档运行此示例时最终得到的警告:developer.gnome.org/gtkmm-tutorial/stable/… 【参考方案1】:

你可以通过给 GtkDialog 一个父级来修复这个警告。相关函数是gtk_window_set_transient_for()(将这个窗口设置为始终在另一个窗口之上,或瞬态)和可选的gtk_window_set_modal(),使其成为模式对话框。这最终是各种 GtkDialog 构造函数所做的。

【讨论】:

这是否意味着我需要将main_window 实例传递给每个对话框类?如果我改为在对话框中使用self.builder.add_objects_from_file(..."main_window"),则会出现错误,因为main_window 信号未连接(这当然是正确的,因为对话框的信号与主窗口不同)。由于类似的原因,Glade 中的设置可能会失败。已设置瞬态选项,但在运行时,对话框无权访问 main_window 实例。 当你显示你的对话时,你有什么理由不能打电话给set_transient_for()?这就是“映射”部分的意思 我可能犯了一个愚蠢的错误,但是在链接行下方插入任何这些变体都无助于错误消息:github.com/tobias47n9e/innstereo/blob/master/innstereo/… 我刚刚又试了一次,如果我将 main_window 对象(GtkWindow)传递给每个对话框然后使用self.dialog.set_transient_for(main_window)(为此我使用了__init__ 函数),它确实有效。再次感谢您的帮助! 我的应用程序只有对话框,没有“主窗口”。我应该将什么传递给这个函数?【参考方案2】:

使用 GtkWindow 代替;并且只有在有父窗口/对话框时才使用 GtkDialog。

【讨论】:

以上是关于没有临时父级的 GtkDialog 映射的主要内容,如果未能解决你的问题,请参考以下文章

创建没有容器作为父级的 Gtk 复合对象

css父级没包住子级是怎么回事,我用firebug查看,确实在父级的div中,但是就是没有包括子级的内容

在没有父级的情况下关闭窗口(网络)

如何在没有父级的情况下居中 DIV? [复制]

nHibernate 保存一对多

setSizePolicy() 与 QSizePolicy.Expanding 不起作用:子级没有扩展到父级的大小