无法为所有 objects 和 window 中的事件获取相同的光标

Cannot get same cursor for all objects and events in a window

我已经搜索和测试了很多,但没有找到强制 window 和所有 children 对所有事件使用相同光标的方法。

在下面的示例代码中,即使将鼠标悬停在 Gtk.Paned 手柄上,我也希望使用 DIAMOND_CROSS 光标。就像现在一样,它切换到水平大小调整箭头。

import gi
gi.require_version('Gdk', '3.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Gdk, Gtk

class MainWindow(Gtk.ApplicationWindow):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("realize", self.on_realize)
        self.connect('delete_event', Gtk.main_quit)
        self.set_default_size(800, 600)

        button1 = Gtk.Button('Button 1')
        button2 = Gtk.Button('Button 2')

        paned = Gtk.Paned()
        paned.set_position(400)
        paned.add1(button1)
        paned.add2(button2)

        self.add(paned)
        self.show_all()

    def on_realize(self, widget):
        cursor = Gdk.Cursor(Gdk.CursorType.DIAMOND_CROSS)
        self.get_window().set_cursor(cursor)

if __name__ == '__main__':
    win = MainWindow()
    Gtk.main()

我刚刚检查了 paned 对象的来源,它在 gtk_paned_state_flags_changed 函数中有以下代码:

if (gtk_widget_is_sensitive (widget))
    cursor = gdk_cursor_new_from_name (gtk_widget_get_display (widget),
                                       priv->orientation == GTK_ORIENTATION_HORIZONTAL
                                       ? "col-resize" : "row-resize");
else
    cursor = NULL;

(https://git.gnome.org/browse/gtk+/tree/gtk/gtkpaned.c?h=3.18.6#n1866)

因此,理论上您可以覆盖 paned 小部件(以及所有其他具有类似行为的小部件)的 do_state_flags_changed 函数来实现您想要的结果。

但是当您要求一种一次性为所有对象设置光标的方法时,答案很简单:不,那是不可能的。