如何在GTKMM 4中实现第二显示器全屏显示?
GTK4 C++ 获取第二显示器并全屏窗口的问题
需求
拥有一个继承自Gtk::Window的窗口,希望调用fullscreen_on_monitor(const Glib::RefPtr<Gdk::Monitor> &monitor)方法,让窗口在第二显示器上全屏显示,但不知道如何正确获取第二显示器的对象实例。
尝试代码及错误
尝试过以下代码:
Glib::RefPtr<Gio::ListModel> ptr = get_display()->get_monitors(); fullscreen_on_monitor((Gdk::Monitor*) ptr->get_object(1).get());
运行时出现错误:Cannot cast 'Glib::ObjectBase *' to 'Gdk::Monitor *' via virtual base 'Glib::ObjectBase'
此前误以为Gdk::Monitor并非Glib::ObjectBase的子类,但实际是错误使用了C风格强制类型转换,而非Glib对象系统提供的安全转换方式。
已知替代方法的局限
了解到Display::get_monitor_at_surface()方法,但该方法要求窗口表面已经处于目标显示器上,无法满足直接将窗口全屏到第二显示器的需求。
解决方案
在GTK4的C++绑定中,需要使用Glib提供的动态转换方法将Glib::Object安全转换为Gdk::Monitor,而非强制类型转换。示例代码如下:
// 获取显示器列表 Glib::RefPtr<Gio::ListModel> monitors = get_display()->get_monitors(); // 确保存在第二台显示器(索引从0开始) if (monitors->get_n_items() > 1) { // 获取索引为1的显示器对象(第二台) Glib::RefPtr<Glib::Object> monitor_obj = monitors->get_object(1); // 动态转换为Gdk::Monitor类型 Glib::RefPtr<Gdk::Monitor> second_monitor = Glib::RefPtr<Gdk::Monitor>::cast_dynamic(monitor_obj); if (second_monitor) { // 在第二显示器全屏窗口 fullscreen_on_monitor(second_monitor); } }
同类Rust问题思路参考
Rust语言中存在同类问题:如何将glib::Object转换为gdk::Monitor,对应的解决思路是使用downcast_ref()方法完成安全转换,原理与C++的cast_dynamic一致。
内容的提问来源于stack exchange,提问作者mltm
相关产品推荐
相关产品推荐

