gtkmm-3.0中Gtk::Widget缺失set_visual()方法,如何设置自定义部件视觉?
问题描述
根据Gtk文档,Widget类存在set_visual()方法,但该方法在gtkmm(C封装库)中缺失。将Gtk应用从C语言移植到使用gtkmm-3.0的C环境时遇到此问题,不过Gtk::Widget类提供了返回部件视觉的get_visual()方法。
原C语言代码示例:
GdkScreen *screen = gtk_widget_get_screen(widget); GdkVisual *visual = gdk_screen_get_rgba_visual(screen); if (visual == NULL) visual = gdk_screen_get_system_visual(screen); gtk_widget_set_visual(widget, visual);
请问如何为Gtk::Widget设置自定义视觉?
解决方案
gtkmm-3.0未为Gtk::Widget封装set_visual()方法,你可以通过直接调用底层C API的方式实现需求,有两种可行写法:
写法一:直接复用原C逻辑
借助Gtk::Widget的gobj()方法获取底层C对象GtkWidget*,沿用原C代码的逻辑调用C API:
GdkScreen* screen = gtk_widget_get_screen(widget.gobj()); GdkVisual* visual = gdk_screen_get_rgba_visual(screen); if (!visual) visual = gdk_screen_get_system_visual(screen); gtk_widget_set_visual(widget.gobj(), visual);
写法二:结合gtkmm封装类
使用gtkmm提供的Gdk::Screen和Gdk::Visual封装类,让代码更贴合C++风格:
Glib::RefPtr<Gdk::Screen> screen = widget.get_screen(); Glib::RefPtr<Gdk::Visual> visual = screen->get_rgba_visual(); if (!visual) visual = screen->get_system_visual(); gtk_widget_set_visual(widget.gobj(), visual->gobj());
两种写法本质都是调用底层C API完成视觉设置,效果完全一致。
内容的提问来源于stack exchange,提问作者Nikos Papachatzakis
相关产品推荐
相关产品推荐

