首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用enaml时获得关键事件?

如何在使用enaml时获得关键事件?
EN

Stack Overflow用户
提问于 2013-12-04 16:38:52
回答 2查看 782关注 0票数 3

我一直在使用enaml (0.6.8 ),这是Canopy目前可用的工具,并成功地创建了一些非常有用的实用程序。然而,我想要拦截键盘事件,以启用一些快速的键盘快捷方式,而不是重复的按钮点击用户界面。

我该怎么处理这个?我知道这将是特定于工具包(qt4)的,但实际上无法确定从何处开始。我在qt中读过一些关于event filters的文章,这似乎是我想要的,但我不了解QApplication等与enaml相关的机制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 02:07:02

当前不支持拦截原始密钥事件,除非您希望通过foo.proxy.widget直接使用工具包小部件(在0.7+系列上;0.6系列不再受支持)。但是,您可以使用支持自定义操作名称(如"Cut\tCtrl+C“和"Paste\tCtrl+V”)触发的加速键的操作来定义一个Cut\tCtrl+C。

票数 4
EN

Stack Overflow用户

发布于 2017-01-04 15:32:46

我创造了一种相当粗糙的方法。使用以下内容创建一个名为key_event.py的文件:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
'''
Created on Jul 20, 2015
@author: jrm
'''
from atom.api import (Callable,Event, Value, Unicode, Bool, Instance,Typed, ForwardTyped, observe)
from enaml.core.declarative import d_
from enaml.widgets.control import Control, ProxyControl
from enaml.qt.qt_control import QtControl
from enaml.qt import QtCore

class ProxyKeyEvent(ProxyControl):
    declaration = ForwardTyped(lambda: KeyEvent)

    def set_enabled(self, enabled):
        raise NotImplementedError

class KeyEvent(Control):
    proxy = Typed(ProxyKeyEvent)

    key_code = d_(Value())
    key = d_(Unicode())
    enabled = d_(Bool(True))
    repeats = d_(Bool(True))

    pressed = d_(Event(),writable=False)
    released = d_(Event(),writable=False)

    @observe('enabled')
    def _update_proxy(self, change):
        """ An observer which sends state change to the proxy.
        """
        super(KeyEvent, self)._update_proxy(change)

class QtKeyEvent(QtControl, ProxyKeyEvent):
    _keyPressEvent = Callable() # Refs to original functions
    _keyReleaseEvent = Callable() # Refs to original functions
    widget = Instance(QtCore.QObject)

    def create_widget(self):
        self.widget = self.parent_widget()
    def init_widget(self):
        super(QtKeyEvent, self).init_widget()
        d = self.declaration
        widget = self.parent_widget()
        self._keyPressEvent = widget.keyPressEvent
        self._keyReleaseEvent = widget.keyPressEvent
        self.set_enabled(d.enabled)

    def set_enabled(self, enabled):
        widget = self.parent_widget()
        if enabled:
            widget.keyPressEvent = lambda event:self.on_key_press(event)
            widget.keyReleaseEvent = lambda event:self.on_key_release(event)
        else:
            # Restore original
            widget.keyPressEvent = self._keyPressEvent
            widget.keyReleaseEvent = self._keyReleaseEvent

    def on_key_press(self,event):
        try:
            if (self.declaration.key_code and event.key()==self.declaration.key_code) or \
                (self.declaration.key and self.declaration.key in event.text()):
                if not self.declaration.repeats and event.isAutoRepeat():
                    return
                self.declaration.pressed(event)
        finally:
            self._keyPressEvent(event)

    def on_key_release(self,event):
        try:
            if (self.declaration.key_code and event.key()==self.declaration.key_code) or \
                (self.declaration.key and self.declaration.key in event.text()):
                if not self.declaration.repeats and event.isAutoRepeat():
                    return
                self.declaration.released(event)
        finally:
            self._keyReleaseEvent(event)

def key_event_factory():
    return QtKeyEvent
# Inject the factory 
from enaml.qt.qt_factories import QT_FACTORIES
QT_FACTORIES['KeyEvent'] = key_event_factory

在enaml文件中导入KeyEvent并使用如下所示:

代码语言:javascript
复制
WidgetToWatchKeys:
  KeyEvent:
    key_code = QtCore.Qt.Key.Key_Up
    pressed :: model.move_up()

  KeyEvent:
    key_code = QtCore.Qt.Key.Key_Left
    pressed :: model.move_left()

  KeyEvent:
    key = 'x'
    pressed :: model.fire()
  #: etc...

也许这不是最好的方法,但它可以很好地满足我的需要。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20380940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档