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()应该调用其他内容),因此错误命名.
对于 GTK4,gtk_widget_get_toplevel()
的方法GtkWidget
已被弃用。相反,您可以使用gtk_widget_get_root()
返回. 然后可以将其转换为or 。Widget:root
GtkRoot
GtkRoot
GtkApplicationWindow()
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)
虽然 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)
希望这有帮助,问候