You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:45:38