在Enaml中捕获窗口焦点

时间:2016-06-21 14:44:59

标签: qt pyqt enaml

当窗口聚焦时,我可以执行代码吗(成为活动窗口,例如当窗口上方的窗口关闭时)?我希望windows只有焦点事件或属性,但似乎并非如此。

Qt中有焦点事件。如果Enaml不提供此功能,那么访问这些基础Qt事件的最简单方法是什么?

我希望能够做到这样的事情:

enamldef MyWindow(Window):
    focus ::
        do_stuff()

1 个答案:

答案 0 :(得分:1)

如果您只想跟踪哪个窗口小部件具有焦点,则可以使用FocusTracker对象。只需在任意位置创建此实例,然后对focused_widget属性做出反应:https://github.com/nucleic/enaml/blob/0f63b494345f2e03ce521adc2c38c6a0ce920266/enaml/widgets/focus_tracker.py

为了处理特定小部件的焦点,您需要启用功能标志并重新实现处理程序功能: https://github.com/nucleic/enaml/blob/0f63b494345f2e03ce521adc2c38c6a0ce920266/enaml/widgets/widget.py#L88 https://github.com/nucleic/enaml/blob/0f63b494345f2e03ce521adc2c38c6a0ce920266/enaml/widgets/widget.py#L133 https://github.com/nucleic/enaml/blob/0f63b494345f2e03ce521adc2c38c6a0ce920266/enaml/widgets/widget.py#L300-L318

enamldef MyWindow(Window):
    Field:
        features = Feature.FocusEvents
        focus_gained => ():
            print 'got focus'
        focus_lost => ():
            print 'lost focus'

代码位于功能标记后面,因为后端所需的工作非常重要,如果没有必要,我们也不想这样做。

没有焦点处理的任何例子,但这里有一些使用声明性函数和其他“隐藏"拖放功能: https://github.com/nucleic/enaml/tree/0f63b494345f2e03ce521adc2c38c6a0ce920266/examples/functions https://github.com/nucleic/enaml/blob/0f63b494345f2e03ce521adc2c38c6a0ce920266/examples/widgets/drag_and_drop.enaml