你能从小部件中获得父GTK窗口吗?

use*_*263 10 gtk window widget

我有一个自定义小部件,它需要启动一个MessageDialog,为了让我将该消息对话框放在我的小部件所在的窗口顶部,我需要访问父gtk.window.有没有办法获得父GTK窗口?谢谢

Hav*_*c P 11

GTK文档建议:

   GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
   if (gtk_widget_is_toplevel (toplevel))
     {
       /* Perform action on toplevel. */
     }
Run Code Online (Sandbox Code Playgroud)

get_toplevel将返回您在里面的最顶部窗口小部件,无论它是否是窗口,因此is_toplevel检查.是的,因为上面的代码执行了"get_toplevel()",然后立即执行"is_toplevel()"(最有可能的是,get_toplevel()应该调用其他内容),因此错误命名.


Han*_*ner 7

在PyGTK的,你可以得到顶级喜欢toplevel = mywidget.get_toplevel()再喂toplevel直接到gtk.MessageDialog()


bmr*_*ing 7

对于 GTK4,gtk_widget_get_toplevel()的方法GtkWidget已被弃用。相反,您可以使用gtk_widget_get_root()返回. 然后可以将其转换为or 。Widget:rootGtkRootGtkRootGtkApplicationWindow()GtkWindow()

这是一个 C 语言的例子

GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (widget));
GtkWindow *window = GTK_WINDOW (root);
Run Code Online (Sandbox Code Playgroud)

这是 Rust 中的一个例子

let window: Window = widget
    .root()
    .unwrap()
    .downcast::<Window>()
    .unwrap();
Run Code Online (Sandbox Code Playgroud)


ser*_*nko 5

虽然 gtk_widget_get_toplevel 应该可以工作,但您也可以尝试下面的代码。它应该获取给定小部件的父 gtk 窗口并打印其标题。

GdkWindow *gtk_window = gtk_widget_get_parent_window(widget);
GtkWindow *parent = NULL;
gdk_window_get_user_data(gtk_window, (gpointer *)&parent);
g_print("%s\n", gtk_window_get_title(parent));
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,问候

  • 这会不必要地绕道低级 GDK Gunge - 最好留在 GTK 层。这里您需要实现小部件,并且在 GTK 3 中可能会出现问题。 (4认同)