GtkOverlay
小部件具有一种特殊的set_overlay_pass_through
方法,可以将输入传递到基础覆盖层。我想使用此功能将GtkDrawingArea
叠加在UI上以添加图纸。不幸的是,它对我不起作用,没有输入事件。
我使用msys2
和gtkmm
。
这是我的代码:
Gtk::DrawingArea drawingArea;
Gtk::Fixed nodeBox; //filled with several widgets
Gtk::Overlay overlay;
overlay.add_overlay(nodeBox);
overlay.add_overlay(drawingArea);
overlay.set_overlay_pass_through(drawingArea,true);
window.add(overlay);
当我更改两个add_overlay
调用的顺序时,输入事件正常工作,但是nodeBox
的小部件隐藏了绘图区域。
drawdarea捕获事件,因为它具有gdk :: window。
与MISC进行比较:
这是缺少物理窗口的一组实用程序小部件的抽象。他们确实在定义的空间内有对齐和填充。
没有窗口,这种类型的小部件无法捕获事件。
对于set_overlay_pass_through
,您需要使用标签,箭头,图像或手动设置GDK ::窗口传递事件:
overlay.set_overlay_pass_through(drawingArea,true);
drawingArea.signal_realize().connect([&]
{
auto gdkWindow = drawingArea.get_window();
gdkWindow->set_pass_through(true);
});
请注意,您仍然需要致电set_overlay_pass_through
,并且必须实现小部件。