Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建事件筛选器_Python_Qt_Events_Pyqt - Fatal编程技术网

Python 创建事件筛选器

Python 创建事件筛选器,python,qt,events,pyqt,Python,Qt,Events,Pyqt,我正在尝试在我的树视图中启用删除键。这就是我到目前为止所做的: class delkeyFilter(QObject): delkeyPressed = pyqtSignal() def eventFilter(self, obj, event): if event.type() == QEvent.KeyPress: if event.key() == Qt.Key_Delete: self.delk

我正在尝试在我的树视图中启用删除键。这就是我到目前为止所做的:

class delkeyFilter(QObject):
    delkeyPressed = pyqtSignal()

    def eventFilter(self,  obj,  event):
        if event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Delete:
                self.delkeyPressed.emit()
                print 'delkey pressed'
                return True
        return False
我像这样连接
eventfilter

    filter = delkeyFilter(self.dataTreeView)
    self.dataTreeView.installEventFilter(filter)

为什么在创建筛选器时需要传递
self.dataTreeview
?没有它就无法工作。

密钥处理已经在
qabstractemview
中实现。您所要做的就是对treeview进行子类化,然后实现
keyPressEvent

class MyTreeView(QTreeView):

    delkeyPressed = pyqtSignal()

    def __init__(self):
        QTreeView.__init__(self)

    def keyPressEvent(self, event): #QKeyEvent
        if event.key() == Qt.Key_Delete:
            self.delkeyPressed.emit()
            print 'del key pressed'

        # pass the event up the chain or we will eat the event
        QTreeView.keyPressEvent(self, event)

`@balpha是正确的。简单的答案是,如果您不传入父级或以其他方式确保
过滤器
实例具有活动引用,它将被垃圾收集

当C++实例被包装时,创建相应的Python对象。Python对象在垃圾收集方面的行为与您预期的一样——当其引用计数达到零时,它将被垃圾收集。那么相应的C++实例会发生什么呢?显而易见的答案可能是调用实例的析构函数。然而,库API可能会说,当实例被传递给特定函数时,库将获得实例的所有权,即调用实例析构函数的责任从SIP生成的模块转移到库

实例的所有权也可能与另一个实例相关联。这意味着,如果拥有的实例被销毁,那么拥有的实例将自动被销毁。SIP跟踪这些关系,以确保Python的循环垃圾收集器能够检测并中断所属实例和所属实例之间的任何引用循环。关联被实现为拥有实例,引用拥有实例

上面的内容意味着,如果您将Python对象传递给拥有所有权的Qt对象,那么即使您没有保证维护对特定对象的引用,一切都将正常工作

因此,为了重申@balpha在其评论中所说的,当您不想将对象传递给构造函数时,这里有一个解决方法:

self.filter = delkeyFilter()
self.dataTreeView.installEventFilter(self.filter)
我认为(但不确定,因此不作为答案发布)如果Python的垃圾收集器没有父过滤器,它将吃掉您的过滤器,因为安装事件过滤器不会创建引用(在Python方面)。要验证这一点,请尝试保留对
filter
的引用(例如说
self.filter=…
),但不要传递父级。