4

GtkOverlay部件有一种特殊的set_overlay_pass_through方法可以将输入传递到底层覆盖。我想使用此功能覆盖GtkDrawingAreaUI 以添加绘图。不幸的是,它对我不起作用,没有输入事件通过。

我正在使用msys2gtkmm

这是我的代码:

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隐藏绘图区域的小部件。

4

1 回答 1

2

DrawingArea捕获事件,因为它具有Gdk::Window

其他比较:

这是一组缺少物理窗口的实用程序小部件的抽象。它们确实在其定义的空间内具有对齐和填充。

如果没有窗口,这种类型的小部件无法捕获事件。

为了set_overlay_pass_through工作,您需要使用LabelArrowImage或手动设置 Gdk::Window 来传递事件:

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并且必须实现小部件。

于 2017-03-14T11:24:12.527 回答